如果查詢緩存有命中的查詢結(jié)果,查詢語句就可以直接去查詢緩存中取數(shù)據(jù)肤视。
緩存在第一次查詢后档痪,MySQL便將查詢語句以及查詢結(jié)果進(jìn)行hash處理并保留在緩存中,SQL查詢到達(dá)之后邢滑,對其進(jìn)行同樣的hash處理后腐螟,將兩個(gè)hash值進(jìn)行對照,如果一樣殊鞭,則命中,從緩存中返回查詢結(jié)果尼桶;否則操灿,需要整個(gè)流程走一遍
發(fā)送SQL語句。
查詢緩存泵督,如果命中緩存直接返回結(jié)果趾盐。
SQL解析,預(yù)處理,再由優(yōu)化器生成對應(yīng)的查詢執(zhí)行計(jì)劃救鲤。 (join過多久窟,index過多都不好,影響速度1静)
執(zhí)行查詢斥扛,調(diào)用存儲(chǔ)引擎API獲取數(shù)據(jù)。?返回結(jié)果丹锹。
show variables like '%query_cache%
show status like '%Qcache%';
索引
MyISAM的索引文件僅僅保存數(shù)據(jù)記錄的地址稀颁,被稱為非聚集索引
Innodb 的主鍵索引為聚集索引,葉子節(jié)點(diǎn)包含完整的數(shù)據(jù)楣黍,稱為為聚集索引匾灶。
每次查找都要經(jīng)過兩次,第一次是通過二級索引找到主鍵租漂, 然后再通過主鍵索引找到數(shù)據(jù)阶女。
更新聚簇索引列的代價(jià)很高,因?yàn)闀?huì)強(qiáng)制InnoDB將每個(gè)被更新的行移動(dòng)到新的位置哩治。
插入速度嚴(yán)重依賴插入順序秃踩。按照主鍵的順序插入式加載數(shù)據(jù)到InnoDB表中速度最快的方式。但如果不是按照主鍵順序加載數(shù)據(jù)锚扎,那么在加載完成后最好使用OPTIMIZE TABLE命令重新組織一下表吞瞪。
結(jié)論:所以如果沒有特別的需要,請永遠(yuǎn)使用一個(gè)與業(yè)務(wù)無關(guān)的自增字段作為主鍵
索引最佳實(shí)踐
不要使用表達(dá)式
索引列不能是表達(dá)式的一部分驾孔,也不能是函數(shù)的參數(shù)芍秆,否則不會(huì)使用索引。
如:SELECT * FROM student WHERE id + 1 = 5
前綴索引和索引選擇性
如果是很長的字符串翠勉,可以只索引前面的部分字符妖啥,前提是保證選擇性。
所謂索引的選擇性(Selectivity)对碌,是指不重復(fù)的索引值(也叫基數(shù)荆虱,Cardinality)與表記錄數(shù)(#T)的比值:
Index Selectivity = Cardinality / #T
比如對一個(gè)url列建立索引。通過選擇性計(jì)算選擇前面幾個(gè)字符建立索引朽们。
多列索引
最左前綴匹配原則
mysql會(huì)一直向右匹配直到遇到范圍查詢(>怀读、<、between骑脱、like)就停止匹配菜枷,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的叁丧,如果建立(a,b,d,c)的索引則都可以用到啤誊,a,b,d的順序可以任意調(diào)整
多列索引的順序很重要
將選擇性高的排在第一位岳瞭。
索引覆蓋
建議select只查詢真正需要的列,這樣就能用到索引覆蓋
利用索引排序
索引用于ORDER BY 和 GROUP BY , ORDER BY子句和查找型查詢的限制是一樣的:需要滿足索引的最左前綴的要求
避免不必要的索引
占用空間
插入更新時(shí)操作會(huì)變慢
Profiling
最常用的方法:分析慢查詢?nèi)罩?br> 分析工具:pt-query-digest
分析索引使用:
Explain
Explain extended, show warnings
分析單條語句執(zhí)行時(shí)間:
Set profiling = 1
……
Show profiles
Show profile for query 1
分析單條語句計(jì)數(shù)器:
Flush status
……
SHOW STATUS WHERE Variable_name LIKE 'Handler%' OR Variable_name LIKE 'Created%';