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