20+条MySQL性能优化的最佳经验
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情。当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能。这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库。希望下面的这些优化技巧对你有用。
1. 为查询缓存优化你的查询大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了。
这里最主要的问题是,对于程序员来说,这个事情是很容易被忽略的。因为,我们某些查询语句会让MySQL不使用缓存。请看下面的示例:
// 查询缓存不开启 $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()"); // 开启查询缓存 $today = date("Y-m-d"); $r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");上面两条SQL语句的差别就是 CURDATE() ,MySQL的查询缓存对这个函数不起作用。所以,像 NOW() 和 RAND() 或是其它的诸如此类的SQL函数都不会开启查询缓存,因为这些函数的返回是会不定的易变的。所以,你所需要的就是用一个变量来代替MySQL的函数,从而开启缓存。
2. EXPLAIN 你的 SELECT 查询使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。
EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的……等等,等等。
挑一个你的SELECT语句(推荐挑选那个最复杂的,有多表联接的),把关键字EXPLAIN加到前面。你可以使用phpmyadmin来做这个事。然后,你会看到一张表格。下面的这个示例中,我们忘记加上了group_id索引,并且有表联接:
当我们为 group_id 字段加上索引后:
我们可以看到,前一个结果显示搜索了 7883 行,而后一个只是搜索了两个表的 9 和 16 行。查看rows列可以让我们找到潜在的性能问题。
3. 当只要一行数据时使用 LIMIT 1当你查询表的有些时候,你已经知道结果只会有一条结果,但因为你可能需要去fetch游标,或是你也许会去检查返回的记录数。
在这种情况下,加上 LIMIT 1 可以增加性能。这样一样,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据。
下面的示例,只是为了找一下是否有“中国”的用户,很明显,后面的会比前面的更有效率。(请注意,第一条中是Select *,第二条是Select 1)
// 没有效率的: $r = mysql_query("SELECT * FROM user WHERE country = 'China'"); if (mysql_num_rows($r) > 0) { // ... } // 有效率的: $r = mysql_query("SELECT 1 FROM user WHERE country = 'China' LIMIT 1"); if (mysql_num_rows($r) > 0) { // ... } 4. 为搜索字段建索引索引并不一定就是给主键或是唯一的字段。如果在你的表中,有某个字段你总要会经常用来做搜索,那么,请为其建立索引吧。
从上图你可以看到那个搜索字串 “last_name LIKE 'a%'”,一个是建了索引,一个是没有索引,性能差了4倍左右。
另外,你应该也需要知道什么样的搜索是不能使用正常的索引的。例如,当你需要在一篇大的文章中搜索一个词时,如: “WHERE post_content LIKE '%apple%'”,索引可能是没有意义的。你可能需要使用MySQL全文索引 或是自己做一个索引(比如说:搜索关键词或是Tag什么的)
5. 在Join表的时候使用相当类型的列,并将其索引如果你的应用程序有很多 JOIN 查询,你应该确认两个表中Join的字段是被建过索引的。这样,MySQL内部会启动为你优化Join的SQL语句的机制。
而且,这些被用来Join的字段,应该是相同的类型的。例如:如果你要把 DECIMAL 字段和一个 INT 字段Join在一起,MySQL就无法使用它们的索引。对于那些STRING类型,还需要有相同的字符集才行。(两个表的字符集有可能不一样)
// 在state中查找company $r = mysql_query("SELECT company_name FROM users LEFT JOIN companies ON (users.state = companies.state) WHERE users.id = $user_id"); // 两个 state 字段应该是被建过索引的,而且应该是相当的类型,相同的字符集。 6. 千万不要 ORDER BY RAND()想打乱返回的数据行?随机挑一个数据?真不知道谁发明了这种用法,但很多新手很喜欢这样用。但你却不了解这样做有多么可怕的性能问题。
如果你真的想把返回的数据行打乱了,你有N种方法可以达到这个目的。这样使用只让你的数据库的性能呈指数级的下降。这里的问题是:MySQL会不得不去执行RAND()函数(很耗CPU时间),而且这是为了每一行记录去记行,然后再对其排序。就算是你用了Limit 1也无济于事(因为要排序)
下面的示例是随机挑一条记录
// 千万不要这样做: $r = mysql_query("SELECT username FROM user ORDER BY RAND() LIMIT 1"); // 这要会更好: $r = mysql_query("SELECT count(*) FROM user"); $d = mysql_fetch_row($r); $rand = mt_rand(0,$d[0] - 1); $r = mysql_query("SELECT username FROM user LIMIT $rand, 1"); 7. 避免 SELECT *从数据库里读出越多的数据,那么查询就会变得越慢。并且,如果你的数据库服务器和WEB服务器是两台独立的服务器的话,这还会增加网络传输的负载。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











MySQL 연결 속도를 최적화하는 방법은 무엇입니까? 개요: MySQL은 다양한 애플리케이션에서 데이터 저장 및 관리에 일반적으로 사용되는 널리 사용되는 관계형 데이터베이스 관리 시스템입니다. 개발 중에는 애플리케이션 성능을 향상시키기 위해 MySQL 연결 속도를 최적화하는 것이 중요합니다. 이 기사에서는 MySQL 연결 속도를 최적화하기 위한 몇 가지 일반적인 방법과 기술을 소개합니다. 목차: 연결 매개변수를 조정하고 네트워크 설정을 최적화하려면 연결 풀을 사용하세요. 긴 유휴 연결을 방지하려면 요약: 연결 풀을 사용하세요.

현 인터넷 시대에 데이터의 중요성은 자명합니다. 인터넷 애플리케이션의 핵심 구성 요소 중 하나인 데이터베이스 백업 및 복구 작업은 특히 중요합니다. 그러나 데이터 양이 계속 증가하고 비즈니스 요구 사항이 점점 더 복잡해짐에 따라 기존 데이터베이스 백업 및 복구 솔루션은 더 이상 최신 애플리케이션의 고가용성 및 고성능 요구 사항을 충족할 수 없습니다. 따라서 MySQL 데이터베이스의 백업 및 복구 성능을 최적화하는 것이 해결해야 할 시급한 문제가 되었습니다. 실제로 우리는 MySQL 데이터를 효과적으로 개선하기 위해 일련의 프로젝트 경험을 채택했습니다.

MySQL에서 AVG 기능을 최적화하여 성능을 향상시키는 방법 MySQL은 많은 강력한 기능을 포함하는 널리 사용되는 관계형 데이터베이스 관리 시스템입니다. AVG 함수는 평균을 계산하는 데 널리 사용되지만 이 함수는 전체 데이터 세트를 순회해야 하기 때문에 대규모 데이터의 경우 성능 문제가 발생합니다. 이 글에서는 MySQL을 통해 AVG 기능을 최적화하여 성능을 향상시키는 방법을 자세히 소개합니다. 1. 인덱스 사용 인덱스는 MySQL 최적화에서 가장 중요한 부분입니다.

TokuDB 엔진 기반 MySQL 최적화: 쓰기 및 압축 성능 향상 소개: 일반적으로 사용되는 관계형 데이터베이스 관리 시스템인 MySQL은 빅 데이터 시대의 맥락에서 증가하는 쓰기 압력과 스토리지 요구 사항에 직면해 있습니다. 이러한 과제를 해결하기 위해 TokuDB 엔진이 탄생했습니다. 이 기사에서는 TokuDB 엔진을 사용하여 MySQL의 쓰기 성능 및 압축 성능을 향상시키는 방법을 소개합니다. 1. TokuDB 엔진이란 무엇입니까? TokuDB 엔진은 높은 쓰기를 처리하도록 설계된 빅데이터 중심 엔진입니다.

MySQL은 웹 애플리케이션 개발 및 데이터 저장에 일반적으로 사용되는 널리 사용되는 관계형 데이터베이스 관리 시스템입니다. 실제 애플리케이션에서는 MySQL의 기본 최적화가 특히 중요하며, 그 중 SQL 문의 고급 최적화는 데이터베이스 성능을 향상시키는 핵심입니다. 이 기사에서는 MySQL의 기본 최적화 구현을 위한 몇 가지 팁과 모범 사례는 물론 특정 코드 예제를 소개합니다. 쿼리 조건 결정 SQL 문을 작성할 때 먼저 쿼리 조건을 명확하게 정의하고 무제한 와일드카드 쿼리 사용을 피해야 합니다. 즉, 쿼리를 열 때 "%"를 사용하지 마십시오.

MySQL 성능 최적화 실용 가이드: B+ 트리 인덱스에 대한 심층적인 이해 소개: 오픈 소스 관계형 데이터베이스 관리 시스템인 MySQL은 다양한 분야에서 널리 사용되고 있습니다. 그러나 데이터의 양이 계속 증가하고 쿼리 요구 사항이 더욱 복잡해짐에 따라 MySQL의 성능 문제는 점점 더 두드러지고 있습니다. 그 중 인덱스의 설계와 사용은 MySQL 성능에 영향을 미치는 주요 요소 중 하나입니다. 이번 글에서는 B+ 트리 인덱스의 원리를 소개하고, 실제 코드 예시를 통해 MySQL의 성능을 최적화하는 방법을 보여드리겠습니다. 1. B+ 트리 인덱스의 원리 B+ 트리는

MySQL은 전자상거래 분야에서 널리 사용되는 관계형 데이터베이스 관리 시스템입니다. 전자상거래 애플리케이션에서는 MySQL을 최적화하고 보호하는 것이 중요합니다. 이 기사에서는 전자 상거래 애플리케이션에서 MySQL의 최적화 및 보안 프로젝트 경험을 분석합니다. 1. 성능 최적화 데이터베이스 아키텍처 설계: 전자상거래 애플리케이션에서는 데이터베이스 설계가 핵심입니다. 합리적인 테이블 구조 설계와 인덱스 설계로 데이터베이스의 쿼리 성능을 향상시킬 수 있습니다. 동시에 테이블 분할 및 파티셔닝 기술을 사용하면 단일 테이블의 데이터 양을 줄이고 쿼리 효율성을 높일 수 있습니다.

인터넷의 급속한 발전으로 인해 MySQL 데이터베이스는 많은 웹사이트, 애플리케이션, 심지어 기업의 핵심 데이터 저장 기술이 되었습니다. 그러나 데이터 볼륨의 지속적인 증가와 동시 액세스의 급격한 증가로 인해 MySQL의 성능 문제는 점점 더 두드러지고 있습니다. PHP의 PDO 클래스는 효율적이고 안정적인 성능으로 인해 MySQL 개발 및 운영에도 널리 사용됩니다. 이 기사에서는 PDO 클래스를 사용하여 MySQL 성능을 최적화하고 데이터베이스의 응답 속도와 동시 액세스 기능을 향상시키는 방법을 소개합니다. 1. PDO 클래스 소개
