什么是慢查詢
慢查詢?nèi)罩疚宕龋櫭剂x,就是查詢花費(fèi)大量時(shí)間的日志蘑斧,是指mysql記錄所有執(zhí)行超過(guò)long_query_time參數(shù)設(shè)定的時(shí)間閾值的SQL語(yǔ)句的日志油够。該日志能為SQL語(yǔ)句的優(yōu)化帶來(lái)很好的幫助。
慢查詢配置
show VARIABLES like 'slow_query_log';
set GLOBAL slow_query_log=1;//開啟1腮敌,關(guān)閉0
Explain執(zhí)行計(jì)劃
*一條查詢語(yǔ)句在經(jīng)過(guò)MySQL查詢優(yōu)化器的各種基于成本和規(guī)則的優(yōu)化會(huì)后生成一個(gè)所謂的執(zhí)行計(jì)劃,通過(guò)使用EXPLAIN關(guān)鍵字可以模擬優(yōu)化器執(zhí)行SQL查詢語(yǔ)句阱当,從而知道MySQL是如何處理你的SQL語(yǔ)句的。
*在SQL查詢的前面加上EXPLAIN關(guān)鍵字就行糜工。比如:EXPLAIN select * from table1
執(zhí)行計(jì)劃詳解
*id:在一個(gè)大的查詢語(yǔ)句中每個(gè)SELECT****關(guān)鍵字都對(duì)應(yīng)一個(gè)唯一的id
*select_type: SELECT****關(guān)鍵字對(duì)應(yīng)的那個(gè)查詢的類型
*table:表名
*partitions:匹配的分區(qū)信息
*type:針對(duì)單表的訪問(wèn)方法
*possible_keys:可能用到的索引
*key:實(shí)際上使用的索引
*key_len:實(shí)際使用到的索引長(zhǎng)度
*ref:當(dāng)使用索引列等值查詢時(shí)弊添,與索引列進(jìn)行等值匹配的對(duì)象信息
*rows:預(yù)估的需要讀取的記錄條數(shù)
*filtered:某個(gè)表經(jīng)過(guò)搜索條件過(guò)濾后剩余記錄條數(shù)的百分比
*Extra:—些額外的信息
查詢優(yōu)化器
高性能的索引使用策略
根據(jù)system>const>eq_ref>ref>range>index>ALL 的原則
*不在索引列上做任何操作
*盡量全值匹配
*最佳左前綴法則
*范圍條件放最后
*覆蓋索引盡量用
*不等于要慎用 || mysql 在使用不等于(!= 或者<>)的時(shí)候無(wú)法使用索引會(huì)導(dǎo)致全表掃描
*null/not null對(duì)索引的可能影響
*like以通配符開頭('%abc...'),mysql索引失效會(huì)變成全表掃描的操作
*字符類型加引號(hào)
*使用or關(guān)鍵字時(shí)要注意
*使用索引掃描來(lái)做排序和分組
*ASC捌木、DESC別混用
*盡可能按主鍵順序插入行