MySQL語(yǔ)句優(yōu)化原則
1. 小表驅(qū)動(dòng)大表(針對(duì)查詢(xún)),可以減少I(mǎi)O
2. 最左前綴法則(針對(duì)索引),索引了多列的時(shí)候,要確保第一個(gè)列一定要存在,且中間的也不能斷,不然就查詢(xún)不到,百分號(hào)放在左邊會(huì)全表掃描,且索引失效,要放右邊
3. 避免頻繁創(chuàng)建和刪除臨時(shí)表,以減少系統(tǒng)表資源的消耗
4. 應(yīng)盡量避免全表掃描, 以下的操作可能會(huì)導(dǎo)致全表掃描:
? ? )在 where 子句中使用!=或<>操作符,可能會(huì)引起全表掃描
? ? )在 where 子句中對(duì)字段進(jìn)行 null 值判斷,可能會(huì)引起全表掃描
? ? )在 where 子句中使用 or 來(lái)連接條件,可能會(huì)引起全表掃描
??? )使用like前置百分號(hào)查詢(xún),一定會(huì)引起全表掃描
? ? )in 和 not in 也要慎用,可能會(huì)引起全表掃描
? ? )在 where 子句中使用參數(shù),可能會(huì)引起全表掃描
? ? )在 where 子句中對(duì)字段進(jìn)行表達(dá)式操作,可能會(huì)引起全表掃描
? ? )在where子句中對(duì)字段進(jìn)行函數(shù)操作,可能會(huì)引起全表掃描
MySQL之索引優(yōu)化
什么是索引:排序的快速查找的數(shù)據(jù)結(jié)構(gòu)? 簡(jiǎn)稱(chēng) 搜索+排序
索引的優(yōu)勢(shì):提高檢索效率,降低IO成本; 通過(guò)索引對(duì)數(shù)據(jù)排序,降低數(shù)據(jù)排序成本,降低CPU消耗.
索引的劣勢(shì):索引要占內(nèi)存空間; 會(huì)降低降低更新表的速度,因?yàn)楦卤頃r(shí),MySQL不僅要保存數(shù)據(jù),還要更新添加的索引列的字段.
為什么需要索引:Mysql的主鍵唯一標(biāo)識(shí),也就是索引,且是按照BTREE,但是假如需求是查身份證,怎么才能快速定位到某個(gè)身份證號(hào)呢,這就涉及到了給相關(guān)字段建索引,這也是優(yōu)化的方向!
怎么建索引:
1. 使用ALTER TABLE命令去增加索引:
ALTER TABLE table_name ADD INDEX index_name (column_list)//添加普通索引,索引值可出現(xiàn)多次缺厉。
ALTER TABLE table_name ADD UNIQUE (column_list)//這條語(yǔ)句創(chuàng)建的索引的值必須是唯一的(除了NULL外弓摘,NULL可能會(huì)出現(xiàn)多次)街立。
ALTER TABLE table_name ADD PRIMARY KEY (column_list)//該語(yǔ)句添加一個(gè)主鍵犯助,這意味著索引值必須是唯一的住诸,且不能為NULL猫胁。
ALTER TABLE table_name ADD FULLTEXT index_name(olumu_name);該語(yǔ)句指定了索引為FULLTEXT箱亿,用于全文索引。
2. 使用CREATE INDEX命令創(chuàng)建:
//標(biāo)準(zhǔn)語(yǔ)句:
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)
//針對(duì)上述數(shù)據(jù)庫(kù):
CREATE INDEX classify_index? ON commodity_list (Classify_Description)
看查詢(xún)的性能及詳細(xì)信息
關(guān)鍵字:explain
explain的用法:explain select * from emp;
出現(xiàn)的結(jié)果:
id??select_type??table??type??possible_keys ?key ?key_len ?ref??rows??Extra
著重關(guān)注type弃秆,key届惋,rows髓帽,Extra
type:system>const>eq_ref>ref>range>index>ALLALL相當(dāng)于全表檢索,性能最差,也恰恰是最多的,index也是全表檢索,但是檢索的是索引,一般我們要優(yōu)化到range,最好能夠到ref.再之上的就是一次就查到的那種,我們不予考慮.
key:key是實(shí)際上用到的索引,possible_keys是理論上用到的索引,我們只看key就好.
rows:所讀取的行數(shù)
Extra:
Extra這里不能出現(xiàn)Using filesort和Using temporary,一旦出現(xiàn)了,就表示非常不好了,必須優(yōu)化或者直接癱瘓了.
Extra中的Using index表示覆蓋索引;
Extra中的Using where表示使用了where過(guò)濾
Extra中的using join buffer表示使用了連接緩存
Extra中的impossible where表示where子句的值總是false,不能用來(lái)獲取任何元組
MySQL怎么避免索引失效
借鑒一位大神的一段話(huà)...
全職匹配我最?lèi)?ài)脑豹,最左前綴要遵守郑藏;
帶頭大哥不能死,中間兄弟不能斷晨缴;
索引列上少計(jì)算译秦,范圍之后全失效;
LIKE百分寫(xiě)最右击碗,覆蓋索引不寫(xiě)*筑悴;
不等空值還有OR,索引影響要注意稍途;
VAR引號(hào)不可丟阁吝, SQL優(yōu)化有訣竅.