Mysql提升索引效率優(yōu)化的八種方法總結(jié)
前言
索引的設(shè)計(jì)可以遵循一些已有的原則,創(chuàng)建索引的時(shí)候應(yīng)盡量考慮符合這些原則,便于提升索引的使用效率,更高效的使用索引。本節(jié)將介紹一些索引的設(shè)計(jì)原則。
1. 選擇唯一性索引
唯一性索引的值是唯一的,可以更快速的通過(guò)該索引來(lái)確定某條記錄。例如,學(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)常用來(lái)做查詢條件,那么該字段的查詢速度會(huì)影響整個(gè)表的查詢速度。因此,為這樣的字段建立索引,可以提高整個(gè)表的查詢速度。
注意:常查詢條件的字段不一定是所要選擇的列,換句話說(shuō),最適合索引的列是出現(xiàn)在 WHERE 子句中的列,或連接子句中指定的列,而不是出現(xiàn)在 SELECT 關(guān)鍵字后的選擇列表中的列。
4. 限制索引的數(shù)目
索引的數(shù)目不是“越多越好”。每個(gè)索引都需要占用磁盤空間,索引越多,需要的磁盤空間就越大。在修改表的內(nèi)容時(shí),索引必須進(jìn)行更新,有時(shí)還可能需要重構(gòu)。因此,索引越多,更新表的時(shí)間就越長(zhǎng)。
如果有一個(gè)索引很少利用或從不使用,那么會(huì)不必要地減緩表的修改速度。此外,MySQL 在生成一個(gè)執(zhí)行計(jì)劃時(shí),要考慮各個(gè)索引,這也要花費(fèi)時(shí)間。創(chuàng)建多余的索引給查詢優(yōu)化帶來(lái)了更多的工作。索引太多,也可能會(huì)使 MySQL 選擇不到所要使用的最佳索引。
5. 盡量使用數(shù)據(jù)量少的索引
如果索引的值很長(zhǎng),那么查詢的速度會(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. 盡量使用前綴來(lái)索引
如果索引字段的值很長(zhǎng),最好使用值的前綴來(lái)索引。例如,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è)沒(méi)意義的值,但是它會(huì)占用物理空間,所以會(huì)帶來(lái)的存儲(chǔ)空間的問(wèn)題,因?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)文章
Navicat工具中設(shè)置MySQL允許外部訪問(wèn)
默認(rèn)情況下MySQL只允許本地登錄,即只能在安裝MySQL環(huán)境所在的主機(jī)下訪問(wèn),這篇文章主要給大家介紹了關(guān)于Navicat工具中設(shè)置MySQL允許外部訪問(wèn)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04mysql經(jīng)典4張表問(wèn)題詳細(xì)講解
MySQL是一種關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),可以通過(guò)連接不同的表將數(shù)據(jù)進(jìn)行關(guān)聯(lián)查詢,下面這篇文章主要給大家介紹了關(guān)于mysql經(jīng)典4張表問(wèn)題的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03node連接mysql數(shù)據(jù)庫(kù)遇到的問(wèn)題和解決方案
這篇文章主要介紹了node連接mysql數(shù)據(jù)庫(kù)遇到的問(wèn)題和解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10mysql的基礎(chǔ)語(yǔ)句和外鍵查詢及其語(yǔ)句詳解(推薦)
這篇文章主要介紹了mysql的基礎(chǔ)語(yǔ)句和外鍵查詢及其語(yǔ)句詳解(推薦),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2025-04-04Mysql數(shù)據(jù)庫(kù)delete操作沒(méi)報(bào)錯(cuò)卻刪除不了數(shù)據(jù)的解決
本文主要介紹了Mysql數(shù)據(jù)庫(kù)delete操作沒(méi)報(bào)錯(cuò)卻刪除不了數(shù)據(jù)的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01MySQL按常規(guī)排序、自定義排序和按中文拼音字母排序的方法
MySQL常規(guī)排序、自定義排序和按中文拼音字母排序,在實(shí)際的SQL編寫時(shí),我們有時(shí)候需要對(duì)條件集合進(jìn)行排序。下面給出3種比較常用的排序方式,一起看看吧2017-04-04