偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

工作中遇到的99%SQL優(yōu)化,這里都能給你解決方案

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

[[284319]]

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

  1. CREATE TABLE `employees` ( 
  2.  `id` int(11) NOT NULL AUTO_INCREMENT, 
  3.  `namevarchar(24) NOT NULL DEFAULT '' COMMENT '姓名'
  4.  `age` int(20) NOT NULL DEFAULT '0' COMMENT '年齡'
  5.  `position` varchar(20) NOT NULL DEFAULT '' COMMENT '職位'
  6.  `hire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '入職時(shí)間'
  7.  PRIMARY KEY (`id`), 
  8.  KEY `idx_name_age_position` (`name`,`age`,`position`) USING BTREE 
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='員工表'
  10. insert into employees(name,age,position,hire_time) values('LiLei', 22, 'manager', NOW()) 
  11. insert into employees(name,age,position,hire_time) values('HanMeimei', 23, 'dev', NOW()) 
  12. insert into employees(name,age,position,hire_time) values('Lucy', 23, 'dev', NOW()) 

全值匹配

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

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

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

 

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

最左前綴法則

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

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

索引失效

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

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

給hire_time增加一個(gè)普通索引:

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

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

  1. ALTER TABLE `employees` DROP INDEX `idx_hire_time`; 

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

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

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

覆蓋索引

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

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

條件判斷

mysql在使用不等于(! = 或者 <>)的時(shí)候無(wú)法使用索引會(huì)導(dǎo)致全表掃描

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

空值判斷

is null,is not null也無(wú)法使用索引

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

like

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

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

字符串不加單引號(hào)索引失效

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

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

or&in少使用

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

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

范圍查詢優(yōu)化

給年齡添加單值索引

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

沒有走索引原因:mysql內(nèi)部?jī)?yōu)化器會(huì)根據(jù)檢索比例、表大小等多個(gè)因素整體評(píng)估是否使用索引。這個(gè)例子沒有走索引可能是因?yàn)閱未螖?shù)據(jù)量查詢過(guò)大導(dǎo)致優(yōu)化器最終選擇不走索引。優(yōu)化方法:可以將大的范圍拆分成多個(gè)小范圍。 

責(zé)任編輯:龐桂玉 來(lái)源: 今日頭條
相關(guān)推薦

2024-10-29 09:42:50

2021-06-27 06:25:14

代碼優(yōu)化技巧Java

2018-10-24 19:59:45

Kubernetes混合云云擴(kuò)展

2022-10-12 15:27:19

物聯(lián)網(wǎng)智慧倉(cāng)儲(chǔ)室內(nèi)跟蹤

2010-10-22 14:20:35

SQL SERVER連

2021-08-31 07:57:21

輪詢鎖多線編程Java

2017-08-01 05:44:10

Dockerweave虛擬機(jī)

2017-08-03 09:37:35

SparkStreamKafkaDirect

2016-01-26 18:01:21

2009-12-01 08:55:53

2021-07-15 08:12:31

體系感面試邏輯思維

2021-06-18 10:45:29

Java內(nèi)存泄漏C++

2017-06-23 11:20:00

DockerWeave內(nèi)核

2014-02-26 09:18:47

應(yīng)用交付優(yōu)化服務(wù)水平協(xié)議

2021-02-23 10:34:51

Java 編程開發(fā)

2013-03-14 11:18:30

Microsoft A解決方案

2010-08-23 16:13:11

DHCP服務(wù)器

2011-05-30 20:37:53

2011-05-30 19:15:37

醫(yī)療行業(yè)浪潮醫(yī)療云云計(jì)算

2011-05-30 20:26:48

廣電云浪潮云海戰(zhàn)略行業(yè)云
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)