日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務,提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

前幾篇文章介紹了MySQL的底層數(shù)據(jù)結(jié)構和mysql優(yōu)化的神器explain。后臺有些朋友說小強只介紹概念,平時使用還是一臉懵,強烈要求小強來一篇實戰(zhàn)sql優(yōu)化,經(jīng)過周末兩天的整理和總結(jié),sql優(yōu)化實戰(zhàn)新鮮出爐, 大家平時學習和工作中,遇到的90% 的sql優(yōu)化都會介紹到,介意篇幅過長,分成3篇文章哈。

CREATE TABLE `employees` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名',
 `age` int(20) NOT NULL DEFAULT '0' COMMENT '年齡',
 `position` varchar(20) NOT NULL DEFAULT '' COMMENT '職位',
 `hire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '入職時間',
 PRIMARY KEY (`id`),
 KEY `idx_name_age_position` (`name`,`age`,`position`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='員工表';
insert into employees(name,age,position,hire_time) values('LiLei', 22, 'manager', NOW())
insert into employees(name,age,position,hire_time) values('HanMeimei', 23, 'dev', NOW())
insert into employees(name,age,position,hire_time) values('Lucy', 23, 'dev', NOW())

全值匹配

索引的字段類型是varchar(n):2字節(jié)存儲字符串長度,如果是utf-8, 則長度是3n+2

EXPLAIN select * from employees where name='LiLei';
工作中遇到的99%SQL優(yōu)化,這里都能給你解決方案

 

EXPLAIN select * from employees where name='LiLei' AND age = 22;
工作中遇到的99%SQL優(yōu)化,這里都能給你解決方案

 

EXPLAIN select * from employees where name='LiLei' AND age = 22 AND position = 'manager';
工作中遇到的99%SQL優(yōu)化,這里都能給你解決方案

 

最左前綴法則

如果索引是多列,要最受最左前綴法則。指的是查詢從索引的最左前列開始并且不跳過索引中的列。以下三條sql根據(jù)最左前綴法則,都不會走索引。

EXPLAIN select * from employees where age = 22 AND position='manager';
EXPLAIN select * from employees where position ='manager';
EXPLAIN select * from employees where age=17;
工作中遇到的99%SQL優(yōu)化,這里都能給你解決方案

 

索引失效

不要在索引列上做任何操作(計算、函數(shù)、類型轉(zhuǎn)換),會導致索引失效而轉(zhuǎn)向全表掃描。

EXPLAIN select * from employees where name='LiLei';
工作中遇到的99%SQL優(yōu)化,這里都能給你解決方案

 

EXPLAIN select * from employees where left(name, 3)='LiLei';
工作中遇到的99%SQL優(yōu)化,這里都能給你解決方案

 

給hire_time增加一個普通索引:

alter table `employees` ADD INDEX `idx_hire_time`(`hire_time`) USING BTREE;
EXPLAIN select * from employees where date(hire_time) = '2019-08-25';
工作中遇到的99%SQL優(yōu)化,這里都能給你解決方案

 

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

ALTER TABLE `employees` DROP INDEX `idx_hire_time`;

存儲引擎不能使用索引中范圍條件右邊的列

-- EXPLAIN SELECT * FROM employees WHERE name ='LiLei' AND age=22 AND position ='manager';
EXPLAIN SELECT * FROM employees WHERE name ='LiLei' AND age>22 AND position ='manager';
工作中遇到的99%SQL優(yōu)化,這里都能給你解決方案

 

看到key_len這個索引長度是78, 也就是只使用到了前兩個字段name和age,postition沒有使用到索引的。

覆蓋索引

盡量使用覆蓋索引(只訪問索引的查詢(索引列包含查詢列)),減少selelct * 語句。

EXPLAIN SELECT name,age,position FROM employees WHERE name ='LiLei' AND age=22 AND position ='manager';
工作中遇到的99%SQL優(yōu)化,這里都能給你解決方案

 

條件判斷

mysql在使用不等于(! = 或者 <>)的時候無法使用索引會導致全表掃描

EXPLAIN SELECT * FROM employees WHERE name !='LiLei' ;
工作中遇到的99%SQL優(yōu)化,這里都能給你解決方案

 

空值判斷

is null,is not null也無法使用索引

EXPLAIN SELECT * FROM employees WHERE name is null;
工作中遇到的99%SQL優(yōu)化,這里都能給你解決方案

 

like

like以通配符開頭(‘$abc’)mysql索引失效會變成全表掃描操作

EXPLAIN SELECT * FROM employees WHERE name LIKE '%Lei';
工作中遇到的99%SQL優(yōu)化,這里都能給你解決方案

 

字符串不加單引號索引失效

EXPLAIN SELECT * FROM employees WHERE name ='1000';
EXPLAIN SELECT * FROM employees WHERE name =1000;
工作中遇到的99%SQL優(yōu)化,這里都能給你解決方案

 

不加單引號的字符串,mysql底層會使用cust函數(shù)將其轉(zhuǎn)換為字符串,此時索引失效。

or&in少使用

少用or或in,用它查詢時,mysql不一定使用索引,mysql內(nèi)部優(yōu)化器會根據(jù)索引比例、表大小等多個因素整體評估是否使用索引。

EXPLAIN SELECT * FROM employees WHERE name ='LiLei' or name='HanMeimei';
工作中遇到的99%SQL優(yōu)化,這里都能給你解決方案

 

范圍查詢優(yōu)化

給年齡添加單值索引

ALTER TABLE `employees`ADD INDEX `idx_age`(`age`) USING BTREE;
EXPLAIN select * from employees where age > 1 and age <= 2000;
工作中遇到的99%SQL優(yōu)化,這里都能給你解決方案

 

沒有走索引原因:mysql內(nèi)部優(yōu)化器會根據(jù)檢索比例、表大小等多個因素整體評估是否使用索引。這個例子沒有走索引可能是因為單次數(shù)據(jù)量查詢過大導致優(yōu)化器最終選擇不走索引。優(yōu)化方法:可以將大的范圍拆分成多個小范圍。

分享到:
標簽:優(yōu)化 sql
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定