MySQL优化系列_常见的sql使用-Mysql中的实践(Mysql优化系列8)
看完了工具,死磕算法,那么怎么從算法和工具去解決我們忽略的用法呢,下面我們來個小試牛刀。
表table employees (id,name,age,position )幾個字段 name, age, work 三個字段作為聯合索引
1、全值匹配
1)EXPLAIN SELECT * FROM employees WHERE name= '張三';
2)EXPLAIN SELECT * FROM employees WHERE name= '張三' AND age = 22;
3)EXPLAIN SELECT * FROM employees WHERE name= '張三' AND age = 22 AND position ='manager';
上面三個sql 可以看到用了聯合索引,同時索引的長度在變化,走了聯合索引,根據聯合索引樹找到對應的主鍵,從主鍵索引樹種找到全部的匹配數據。因為mysql優化實現的聯合索引葉子節點除了索引本身,就是主鍵索引樹。
2,最左前綴原則(非主鍵聯合索引)
如果索引了多列,查詢從索引的最左前列開始并且不跳過索引 中的列。這就是最左前綴法則。減去我們不要的列效率會更高。只從聯合索引中去數據就能滿足就行,不必再去一次主鍵索引樹查找數據。
EXPLAIN SELECT * FROM employees WHERE age = 22 AND position ='manager';
EXPLAIN SELECT * FROM employees WHERE position = 'manager';
上面連個sql沒有走索引,這是不符合聯合索引最左前綴原則,因為聯合索引樹是按照創建索引字段添加數據去創建的,用age ,age + position ,position 這三種都是全表掃描,走聯合索引樹還沒全部掃描效率高。
EXPLAIN SELECT * FROM employees WHERE name = '張三';
EXPLAIN SELECT * FROM employees WHERE name = '張三' ;
EXPLAIN SELECT * FROM employees WHERE name ='張三' and position = 'manager';
上面三個sql 只走聯合索引樹的第一個字段,是可以實現的eg:
所以使用聯合索引的時候要注意這幾個順序組合,合理的設置聯合索引。
3、不在索引列上做任何操作(計算、函數、(自動or手動)類型轉換),會導致索引失效而轉 向全表掃描
EXPLAIN SELECT * FROM employees WHERE left(name,3) = '張三';
給hire_time增加一個普通索引:
EXPLAIN select * from employees where date(hire_time) ='2018-09-30';
轉化為日期范圍查詢,會走索引:
EXPLAIN select * from employees where hire_time >='2018-09-30 00:00:00' and hire_time <='2018-09-30 23:59:59';
這個時候又會走索引,索引在范圍查詢是可以走索引的。
EXPLAIN SELECT * FROM employees WHERE name= '張三' and age = 22 AND position ='manager'; 這個sql 調整順序是可以正常走索引的 。
4.存儲引擎不能使用索引中范圍條件右邊的列
EXPLAIN SELECT * FROM employees WHERE name= '張三' AND age > 22 AND position ='manager';
第三個字段沒有走索引。
5、盡量使用覆蓋索引,減少select *語句
就是盡可能的只是使用索引字段中存在的列。
EXPLAIN SELECT name,age FROM employees WHERE name= 'LiLei' AND age = 23 AND position ='manager';
雖然根據這個條件看這兩個sql最終只走一個聯合索引,可是select * 他還走了一次主鍵索引樹。
限于篇幅,后面再介紹其他的常用的方式。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的MySQL优化系列_常见的sql使用-Mysql中的实践(Mysql优化系列8)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装Orchard错误
- 下一篇: mysql基础表和修理表_MySQL基础