日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL调优(二)——索引最佳实践

發(fā)布時(shí)間:2023/12/20 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL调优(二)——索引最佳实践 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.



1.全值匹配
EXPLAIN SELECT * FROM employees WHERE name= ‘LiLei’;

EXPLAIN SELECT * FROM employees WHERE name= ‘LiLei’ AND age = 22;

EXPLAIN SELECT * FROM employees WHERE name= ‘LiLei’ AND age = 22 ANDposition =‘manager’;

2.最左前綴法則
如果索引了多列,要遵守最左前綴法則。
指的是查詢從索引的最左前列開始并且不跳過索引中的列。
EXPLAIN SELECT * FROM employees WHERE age = 22 AND position =‘manager’;
EXPLAIN SELECT * FROM employees WHERE position = ‘manager’;
EXPLAIN SELECT * FROM employees WHERE name = ‘LiLei’;

3.不在索引列上做任何操作(計(jì)算、函數(shù)、(自動(dòng)or手動(dòng))類型轉(zhuǎn)換),會(huì)導(dǎo)致索引失效而轉(zhuǎn)向全表掃描
EXPLAIN SELECT * FROM employees WHERE name = ‘LiLei’;
EXPLAIN SELECT * FROM employees WHERE left(name,3) = ‘LiLei’;
給hire_time增加一個(gè)普通索引:

EXPLAIN select * from employees where date(hire_time) =‘2018-09-30’

EXPLAIN select * from employees where hire_time >=‘2018-09-30 00:00:00’ andhire_time <=‘2018-09-30 23:59:59’

還原最初索引狀態(tài)

4.存儲(chǔ)引擎不能使用索引中范圍條件右邊的列
EXPLAIN SELECT * FROM employees WHERE name= ‘LiLei’ AND age = 22 ANDposition =‘manager’;
EXPLAIN SELECT * FROM employees WHERE name= ‘LiLei’ AND age > 22 ANDposition =‘manager’

5.盡量使用覆蓋索引(只訪問索引的查詢(索引列包含查詢列)),減少select *語句
EXPLAIN SELECT name,age FROM employees WHERE name= ‘LiLei’ AND age = 23AND position =‘manager

EXPLAIN SELECT * FROM employees WHERE name= ‘LiLei’ AND age = 23 ANDposition =‘manager’

6.mysql在使用不等于(!=或者<>)的時(shí)候無法使用索引會(huì)導(dǎo)致全表掃描
EXPLAIN SELECT * FROM employees WHERE name != ‘LiLei’;

7.is null,is not null 也無法使用索引
EXPLAIN SELECT * FROM employees WHERE name is null

8.like以通配符開頭(’$abc…’)mysql索引失效會(huì)變成全表掃描操作
EXPLAIN SELECT * FROM employees WHERE name like ‘%Lei’

EXPLAIN SELECT * FROM employees WHERE name like ‘Lei%

問題:解決like’%字符串%'索引不被使用的方法?
a)使用覆蓋索引,查詢字段必須是建立覆蓋索引字段
EXPLAIN SELECT name,age,position FROM employees WHERE name like ‘%Lei%’;

b)如果不能使用覆蓋索引則可能需要借助搜索引擎

9.字符串不加單引號(hào)索引失效
EXPLAIN SELECT * FROM employees WHERE name = ‘1000’;
EXPLAIN SELECT * FROM employees WHERE name = 1000;

10.少用or或in,
用它查詢時(shí),mysql不一定使用索引,mysql內(nèi)部?jī)?yōu)化器會(huì)根據(jù)檢索比例、表大小等多個(gè)因素整體評(píng)估是否使用索引,詳見范圍查詢優(yōu)化EXPLAIN SELECT * FROM employees WHERE name = ‘LiLei’ or name = ‘HanMeimei’

11.范圍查詢優(yōu)化
給年齡添加單值索引

explain select * from employees where age >=1 and age <=2000;

沒走索引原因:mysql內(nèi)部?jī)?yōu)化器會(huì)根據(jù)檢索比例、表大小等多個(gè)因素整體評(píng)估是否使用索引。
比如這個(gè)例子,可能是由于單次數(shù)據(jù)量查詢過大導(dǎo)致優(yōu)化器最終選擇不走索引優(yōu)化方法:可以講大的范圍拆分成多個(gè)小范圍
explain select * from employees where age >=1 and age <=1000;
explain select * from employees where age >=1001 and age <=2000

還原最初索引狀態(tài)
1ALTER TABLE employees
2DROP INDEX idx_age;
索引使用總結(jié):

like KK%相當(dāng)于=常量,%KK和%KK% 相當(dāng)于范圍

總結(jié)

以上是生活随笔為你收集整理的MySQL调优(二)——索引最佳实践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。