Mysql提升索引效率優(yōu)化的八種方法總結(jié)
前言
索引的設(shè)計(jì)可以遵循一些已有的原則,創(chuàng)建索引的時(shí)候應(yīng)盡量考慮符合這些原則,便于提升索引的使用效率,更高效的使用索引。本節(jié)將介紹一些索引的設(shè)計(jì)原則。
1. 選擇唯一性索引
唯一性索引的值是唯一的,可以更快速的通過該索引來確定某條記錄。例如,學(xué)生表中學(xué)號(hào)是具有唯一性的字段。為該字段建立唯一性索引可以很快的確定某個(gè)學(xué)生的信息。如果使用姓名的話,可能存在同名現(xiàn)象,從而降低查詢速度。
2. 為經(jīng)常需要排序、分組和聯(lián)合操作的字段建立索引
經(jīng)常需要 ORDER BY、GROUP BY、DISTINCT 和 UNION 等操作的字段,排序操作會(huì)浪費(fèi)很多時(shí)間。如果為其建立索引,可以有效地避免排序操作。
3. 為常作為查詢條件的字段建立索引
如果某個(gè)字段經(jīng)常用來做查詢條件,那么該字段的查詢速度會(huì)影響整個(gè)表的查詢速度。因此,為這樣的字段建立索引,可以提高整個(gè)表的查詢速度。
注意:常查詢條件的字段不一定是所要選擇的列,換句話說,最適合索引的列是出現(xiàn)在 WHERE 子句中的列,或連接子句中指定的列,而不是出現(xiàn)在 SELECT 關(guān)鍵字后的選擇列表中的列。
4. 限制索引的數(shù)目
索引的數(shù)目不是“越多越好”。每個(gè)索引都需要占用磁盤空間,索引越多,需要的磁盤空間就越大。在修改表的內(nèi)容時(shí),索引必須進(jìn)行更新,有時(shí)還可能需要重構(gòu)。因此,索引越多,更新表的時(shí)間就越長。
如果有一個(gè)索引很少利用或從不使用,那么會(huì)不必要地減緩表的修改速度。此外,MySQL 在生成一個(gè)執(zhí)行計(jì)劃時(shí),要考慮各個(gè)索引,這也要花費(fèi)時(shí)間。創(chuàng)建多余的索引給查詢優(yōu)化帶來了更多的工作。索引太多,也可能會(huì)使 MySQL 選擇不到所要使用的最佳索引。
5. 盡量使用數(shù)據(jù)量少的索引
如果索引的值很長,那么查詢的速度會(huì)受到影響。例如,對(duì)一個(gè) CHAR(100) 類型的字段進(jìn)行全文檢索需要的時(shí)間肯定要比對(duì) CHAR(10) 類型的字段需要的時(shí)間要多。
6. 數(shù)據(jù)量小的表最好不要使用索引
由于數(shù)據(jù)較小,查詢花費(fèi)的時(shí)間可能比遍歷索引的時(shí)間還要短,索引可能不會(huì)產(chǎn)生優(yōu)化效果。
7. 盡量使用前綴來索引
如果索引字段的值很長,最好使用值的前綴來索引。例如,TEXT 和 BLOG 類型的字段,進(jìn)行全文檢索會(huì)很浪費(fèi)時(shí)間。如果只檢索字段的前面的若干個(gè)字符,這樣可以提高檢索速度。
8. 刪除不再使用或者很少使用的索引
表中的數(shù)據(jù)被大量更新,或者數(shù)據(jù)的使用方式被改變后,原有的一些索引可能不再需要。應(yīng)該定期找出這些索引,將它們刪除,從而減少索引對(duì)更新操作的影響。
9. 索引最好設(shè)置為 NOT NULL:
索引列存在 NULL 就會(huì)導(dǎo)致優(yōu)化器在做索引選擇的時(shí)候更加復(fù)雜,更加難以優(yōu)化,因?yàn)榭蔀?NULL 的列會(huì)使索引、索引統(tǒng)計(jì)和值比較都更復(fù)雜,比如進(jìn)行索引統(tǒng)計(jì)時(shí),count 會(huì)省略值為NULL 的行。
NULL 值是一個(gè)沒意義的值,但是它會(huì)占用物理空間,所以會(huì)帶來的存儲(chǔ)空間的問題,因?yàn)?InnoDB 存儲(chǔ)記錄的時(shí)候,如果表中存在允許為 NULL 的字段,那么行格式 中至少會(huì)用 1 字節(jié)空間存儲(chǔ) NULL 值列表。

10. 防止索引失效:
我們?cè)O(shè)置了索引并不意味著一定會(huì)用上索引,再某些情況下索引也會(huì)失效。
- 當(dāng)我們使用左或者左右模糊匹配的時(shí)候,也就是 Link %x 或者 Link %x% 這兩種方式都會(huì)造成索引失效;
- 當(dāng)我們?cè)诓樵儣l件中對(duì)索引列做了計(jì)算、函數(shù)、類型轉(zhuǎn)換操作,這些情況下都會(huì)造成索引失效;
- 聯(lián)合索引要能正確使用需要遵循最左匹配原則,也就是按照最左優(yōu)先的方式進(jìn)行索引的匹配,否則就會(huì)導(dǎo)致索引失效。
- 在 WHERE 子句中,如果在 or 前的條件列是索引列,而在 or 后的條件列不是索引列,那么索引會(huì)失效。
總結(jié)
選擇索引的最終目的是為了使查詢的速度變快,上面給出的原則是最基本的準(zhǔn)則,但不能只拘泥于上面的準(zhǔn)則。應(yīng)該在學(xué)習(xí)和工作中不斷的實(shí)踐,根據(jù)應(yīng)用的實(shí)際情況進(jìn)行分析和判斷,選擇最合適的索引方式。
相關(guān)文章
在MySQL中如何存取List<String>數(shù)據(jù)
這篇文章主要介紹了在MySQL中如何存取List<String>數(shù)據(jù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
mysql:Can''t start server: can''t create PID file: No space
這篇文章主要介紹了mysql啟動(dòng)失敗不能正常啟動(dòng)并報(bào)錯(cuò)Can't start server: can't create PID file: No space left on device問題解決方法,需要的朋友可以參考下2015-05-05
phpMyAdmin下將Excel中的數(shù)據(jù)導(dǎo)入MySql的圖文方法
使用phpMyAdmin將Excel中的數(shù)據(jù)導(dǎo)入MySql,需要將execl導(dǎo)入到mysql數(shù)據(jù)庫的朋友可以參考下。2010-08-08
SQL行列轉(zhuǎn)置以及非常規(guī)的行列轉(zhuǎn)置示例代碼
轉(zhuǎn)置即旋轉(zhuǎn)數(shù)據(jù)表的橫縱方向,常用來改變數(shù)據(jù)布局,以便用新的角度觀察,下面這篇文章主要給大家介紹了關(guān)于SQL行列轉(zhuǎn)置以及非常規(guī)行列轉(zhuǎn)置的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08

