合理建立索引需遵循:1. 選擇高區(qū)分度列,如手機(jī)號(hào)優(yōu)于性別;2. 多條件查詢優(yōu)先用聯(lián)合索引并遵守最左前綴原則;3. 控制索引數(shù)量以降低寫開銷;4. 利用覆蓋索引避免回表;5. 避免在索引列使用函數(shù)導(dǎo)致失效;6. 主鍵選用自增整數(shù)減少碎片;7. 大字段慎用索引,可選前綴或全文索引。
在MySQL中,合理建立索引能顯著提升查詢性能,但不恰當(dāng)?shù)乃饕炊鴷?huì)增加維護(hù)成本并影響寫操作。以下是建立索引時(shí)應(yīng)遵循的核心原則。
索引的效率與列的選擇性(即唯一值的比例)密切相關(guān)。選擇性越高,查詢時(shí)過濾數(shù)據(jù)的效果越好。
例如,在一個(gè)擁有10萬用戶的表中,性別字段只有“男”“女”兩個(gè)值,選擇性很低,不適合作為單獨(dú)索引;而手機(jī)號(hào)或郵箱這類幾乎唯一的字段,則非常適合作為索引。
當(dāng)查詢涉及多個(gè)條件時(shí),使用聯(lián)合索引通常比多個(gè)單列索引更高效,因?yàn)镸ySQL只能對(duì)一個(gè)表使用一個(gè)單列索引(除非使用了索引合并,但效果有限)。
例如,查詢語句為:
SELECT * FROM users WHERE city = 'Beijing' AND age = 25;
此時(shí)創(chuàng)建聯(lián)合索引 (city, age)
比分別創(chuàng)建 city
和 age
的單列索引更有效。
注意:聯(lián)合索引遵循最左前綴原則,即查詢必須從索引的最左列開始才能命中索引。
每增加一個(gè)索引,都會(huì)帶來以下開銷:
建議只在經(jīng)常用于查詢條件(WHERE)、連接(JOIN)、排序(ORDER BY)和分組(GROUP BY)的列上建立索引。
如果一個(gè)索引包含了查詢所需的所有字段,稱為覆蓋索引,此時(shí)MySQL無需回表查詢主鍵索引,能大幅提升性能。
例如,有聯(lián)合索引 (name, age)
,執(zhí)行:
SELECT name, age FROM users WHERE name = 'Alice';
這個(gè)查詢可以直接從索引中獲取數(shù)據(jù),不需要訪問數(shù)據(jù)行。
在索引列上使用函數(shù)、表達(dá)式或類型轉(zhuǎn)換會(huì)導(dǎo)致索引無法使用。
例如,以下寫法將導(dǎo)致索引失效:
SELECT * FROM users WHERE YEAR(create_time) = 2023;
應(yīng)改寫為:
SELECT * FROM users WHERE create_time >= '2023-01-01' AND create_time < '2024-01-01';
InnoDB引擎使用主鍵作為聚簇索引,主鍵的選擇直接影響插入性能和頁分裂頻率。
使用自增整型主鍵(如 INT 或 BIGINT)能保證數(shù)據(jù)物理存儲(chǔ)有序,減少頁分裂,提高插入效率。
避免使用UUID或字符串作為主鍵,除非有特殊業(yè)務(wù)需求,否則會(huì)導(dǎo)致插入隨機(jī)化、索引碎片嚴(yán)重。
TEXT、BLOB 或長字符串列不適合直接建立普通索引,會(huì)占用大量空間且效率低。
若必須索引,可考慮:
INDEX(content(100))
基本上就這些。索引設(shè)計(jì)要結(jié)合實(shí)際查詢場(chǎng)景,定期通過 EXPLAIN 分析執(zhí)行計(jì)劃,確保索引真正被使用,同時(shí)根據(jù)業(yè)務(wù)變化及時(shí)調(diào)整。不復(fù)雜但容易忽略細(xì)節(jié)。
以上就是mysql索引建立的原則的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)