首頁 資料庫 mysql教程 20+条MySQL性能优化的最佳经验

20+条MySQL性能优化的最佳经验

Jun 07, 2016 pm 02:59 PM
mysql優化 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索引,并且有表联接:

no-primary-key

当我们为 group_id 字段加上索引后:

optimized_explain

我们可以看到,前一个结果显示搜索了 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. 为搜索字段建索引

索引并不一定就是给主键或是唯一的字段。如果在你的表中,有某个字段你总要会经常用来做搜索,那么,请为其建立索引吧。

search_index

从上图你可以看到那个搜索字串 “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服务器是两台独立的服务器的话,这还会增加网络传输的负载。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1246
24
如何優化MySQL連線速度? 如何優化MySQL連線速度? Jun 29, 2023 pm 02:10 PM

如何優化MySQL連線速度?概述:MySQL是一種廣泛使用的關聯式資料庫管理系統,常用於各種應用程式的資料儲存和管理。在開發過程中,MySQL連線速度的最佳化對於提高應用程式的效能至關重要。本文將介紹一些優化MySQL連線速度的常用方法和技巧。目錄:使用連線池調整連線參數最佳化網路設定使用索引和快取避免長時間空閒連線配置適當的硬體資源總結正文:使用連線池

MySQL資料庫備份與復原效能最佳化的專案經驗解析 MySQL資料庫備份與復原效能最佳化的專案經驗解析 Nov 02, 2023 am 08:53 AM

在當前網路時代,數據的重要性不言而喻。作為網路應用的核心組成部分之一,資料庫的備份與復原工作顯得格外重要。然而,隨著資料量的不斷增大和業務需求的日益複雜,傳統的資料庫備份與復原方案已無法滿足現代應用的高可用和高效能要求。因此,對MySQL資料庫備份與復原效能進行最佳化成為亟需解決的問題。在實務過程中,我們採取了一系列的專案經驗,有效提升了MySQL數據

如何透過MySQL對AVG函數最佳化來提高效能 如何透過MySQL對AVG函數最佳化來提高效能 May 11, 2023 am 08:00 AM

如何透過MySQL對AVG函數最佳化來提高效能MySQL是一款流行的關聯式資料庫管理系統,其中包含了許多強大的函數以及功能。其中AVG函數被廣泛使用在計算平均值的情形,但由於這個函數需要遍歷整個資料集,所以在大規模資料的情況下會導致效能問題。本文將詳細介紹如何透過MySQL對AVG函數進行最佳化,進而提高效能。 1.使用索引索引是MySQL最佳化中最重要的一部分,

基於TokuDB引擎的MySQL最佳化:提升寫入與壓縮效能 基於TokuDB引擎的MySQL最佳化:提升寫入與壓縮效能 Jul 25, 2023 pm 11:45 PM

基於TokuDB引擎的MySQL最佳化:提升寫入與壓縮效能引言:MySQL作為一種常用的關聯式資料庫管理系統,在大數據時代的脈絡下,面臨越來越高的寫入壓力和儲存需求。為了應對這項挑戰,TokuDB引擎應運而生。本文將介紹如何利用TokuDB引擎來提升MySQL的寫入效能與壓縮效能。一、什麼是TokuDB引擎? TokuDB引擎是一種面向大數據的、用於處理高寫入

如何實現MySQL底層優化:SQL語句高階優化的技巧與最佳實踐 如何實現MySQL底層優化:SQL語句高階優化的技巧與最佳實踐 Nov 08, 2023 pm 04:32 PM

MySQL是一種廣泛使用的關聯式資料庫管理系統,常用於Web應用程式的開發與資料儲存。在實際應用中,對MySQL的底層最佳化特別重要,其中SQL語句的高階最佳化是提升資料庫效能的關鍵所在。本文將介紹實現MySQL底層優化的一些技巧和最佳實踐,以及具體的程式碼範例。確定查詢條件在編寫SQL語句時,首先要明確定義查詢條件,避免使用無限制的通配符查詢,即避免使用"%"開

MySQL效能優化實戰指南:深入理解B+樹索引 MySQL效能優化實戰指南:深入理解B+樹索引 Jul 25, 2023 pm 08:02 PM

MySQL效能最佳化實戰指南:深入理解B+樹索引引言:MySQL作為開源的關聯式資料庫管理系統,廣泛應用於各個領域。然而,隨著資料量的不斷增加和查詢需求的複雜化,MySQL的效能問題也越來越突出。其中,索引的設計和使用是影響MySQL效能的關鍵因素之一。本文將介紹B+樹索引的原理,並以實際的程式碼範例展示如何最佳化MySQL的效能。一、B+樹索引的原理B+樹是一

如何用PHP的PDO類別實現MySQL的效能最佳化 如何用PHP的PDO類別實現MySQL的效能最佳化 May 10, 2023 pm 11:51 PM

隨著網路的快速發展,MySQL資料庫也成為了許多網站、應用程式甚至企業的核心資料儲存技術。然而,隨著資料量的不斷增長和並發存取的急劇提高,MySQL的效能問題也愈發突顯。而PHP的PDO類別也因其高效穩定的效能而被廣泛運用於MySQL的開發與操作。在本篇文章中,我們將介紹如何利用PDO類最佳化MySQL效能,提升資料庫的回應速度與並發存取能力。一、PDO類介紹

MySQL在電子商務應用中的最佳化與安全專案經驗解析 MySQL在電子商務應用中的最佳化與安全專案經驗解析 Nov 03, 2023 am 10:42 AM

MySQL是一種廣泛應用於電子商務領域的關聯式資料庫管理系統。在電子商務應用中,對MySQL進行最佳化和安全工作是至關重要的。本文將解析MySQL在電子商務應用中的最佳化與安全專案經驗。一、效能最佳化資料庫架構設計:在電子商務應用中,資料庫的設計是關鍵。合理的表結構設計和索引設計能夠提高資料庫的查詢效能。同時,使用分錶和分區技術可以減少單一表的資料量,並提高查詢效率

See all articles