成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL 索引創建和優化實踐

運維 數據庫運維
本文以 employees 表為例子,結合具體的索引運用實踐案例,通過分析 EXPLAIN 關鍵字獲取執行計劃,來驗證我們這些索引實踐。如果是執行計劃相關的詳細信息,大家可以參考 mysql 官網 explain 介紹。

[[434021]]

本文轉載自微信公眾號「運維開發故事」,作者老鄭。轉載本文請聯系運維開發故事公眾號。

本文以 employees 表為例子,結合具體的索引運用實踐案例,通過分析 EXPLAIN 關鍵字獲取執行計劃,來驗證我們這些索引實踐。如果是執行計劃相關的詳細信息,大家可以參考 mysql 官網 explain 介紹。

mysql 版本: 5.7.23

使用的表

  1. CREATE TABLE employees ( 
  2.  id int(11) NOT NULL AUTO_INCREMENT, 
  3.  name varchar(24) NOT NULL DEFAULT '' COMMENT '姓名'
  4.  age int(11) NOT NULL DEFAULT '0' COMMENT '年齡'
  5.  position varchar(20) NOT NULL DEFAULT '' COMMENT '職位'
  6.  hire_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入職時間'
  7.  PRIMARY KEY (id), 
  8.  KEY idx_name_age_position USING BTREE (name, age, position) 
  9. ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARSET = utf8 COMMENT '員工記錄表'
  10.  
  11. INSERT INTO employees (name, age, position, hire_time) VALUES ('LiLei', 22, 'manager', NOW()); 
  12.  
  13. INSERT INTO employees (name, age, position, hire_time) VALUES ('WaKen', 23, 'dev', NOW()); 
  14.  
  15. INSERT INTO employees (name, age, position, hire_time) VALUES ('Lucy', 23, 'dev', NOW()); 

復合索引數據結構

下面是一個復合索引的是示意圖

索引最佳實踐

1. 全值匹配

對于全值匹配,就是查詢條件能夠命中索引的全部列,或者復合索引需要命中左邊的數據

  1. EXPLAIN SELECT * FROM employees WHERE name'LiLei'

  1. EXPLAIN SELECT * FROM employees WHERE name'LiLei' AND age = 22; 

  1. EXPLAIN SELECT * FROM employees WHERE name'LiLei' AND age = 22 AND position ='manager'

2.最佳左前綴法則

如果索引了多列,要遵守最左前綴法則。指的是查詢從索引的最左前列開始并且不跳過索引中的列。

  1. EXPLAIN SELECT * FROM employees WHERE age = 22 AND position ='manager'

  1. EXPLAIN SELECT * FROM employees WHERE position = 'manager'

  1. EXPLAIN SELECT * FROM employees WHERE name = 'LiLei'

3.不在索引列上做任何操作(計算、函數、(自動or手動)類型轉換),會導致索引失效而轉向全表掃描

使用全值匹配能夠正常使用索引

  1. EXPLAIN SELECT * FROM employees WHERE name = 'LiLei'

使用 left 或者其他的數據庫函數導致索引未命中。會走一個全表掃描。

  1. EXPLAIN SELECT * FROM employees WHERE left(name,3) = 'LiLei'

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

全值匹配如下。

  1. EXPLAIN SELECT * FROM employees WHERE name'LiLei' AND age = 22 AND position ='manager'

如果我們中間增加一個范圍查找,會導致右邊的查詢條件無法使用索引。我們對比一下,上下兩條 sql 的差別。

  1. EXPLAIN SELECT * FROM employees WHERE name'LiLei' AND age > 22 AND position ='manager'

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

對于 select 指定字段查詢,如果查詢的所有列都是索引上的數據,那么可以減少 “回表”。查詢的效率高于 select *

  1. explain select name,age from employees where name = 'Lilei' and age = 23 and position= 'manage'

  1. EXPLAIN SELECT * FROM employees WHERE name'LiLei' AND age = 23 AND position ='manager'

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

  1. EXPLAIN SELECT * FROM employees WHERE name != 'LiLei'

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

因為在 mysql 變長的數據類型中,如 varchar 。null 不會存儲,它需要一個額外的標志位來存儲。所以如果我們使用 is null , is not null 是無法使用索引的。所以我們在 DDL 語句中盡量讓每個字段都有默認值。

  1. EXPLAIN SELECT * FROM employees WHERE name is null

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

  1. EXPLAIN SELECT * FROM employees WHERE name like '%Lei'

  1. EXPLAIN SELECT * FROM employees WHERE name like 'Lei%'

問題:解決like'%字符串%'索引不被使用的方法?a)使用覆蓋索引,查詢字段必須是建立覆蓋索引字段

  1. EXPLAIN SELECT name,age,position FROM employees WHERE name like '%Lei%'

b)當覆蓋索引指向的字段是varchar(380)及380以上的字段時,覆蓋索引會失效!

9. 如果查詢條件導致類型轉換會導致索引失效

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

加上單引號,無需數據轉換 name 存儲數據也是 varchar 類型。

  1. EXPLAIN SELECT * FROM employees WHERE name = '1000'

如果不加單引號,發生數據類型轉換導致本次查詢索引失效。

  1. EXPLAIN SELECT * FROM employees WHERE name = 1000; 

10.少用or,用它連接時很多情況下索引會失效

  1. EXPLAIN SELECT * FROM employees WHERE name = 'LiLei' or name = 'HanMeimei'

小總結

like KK%相當于=常量,%KK和%KK% 相當于范圍 下面是常見的幾種索引查詢失效或者,可用的判定

總結 1

總結 2

參考文檔

https://blog.csdn.net/qq_38138069/article/details/82998658

https://www.processon.com/u/5e26625de4b00fbcc45e576d

https://zhuanlan.zhihu.com/p/94190700

https://dev.mysql.com/doc/refman/5.7/en/explain-output.html

 

責任編輯:武曉燕 來源: 運維開發故事
相關推薦

2011-07-20 09:16:02

MongoDB索引稀疏索引

2020-03-23 15:15:57

MySQL性能優化數據庫

2020-10-19 19:45:58

MySQL數據庫優化

2011-10-13 09:44:49

MySQL

2011-05-30 10:36:49

MySQL

2018-06-07 08:54:01

MySQL性能優化索引

2024-04-17 12:58:15

MySQL索引數據庫

2024-10-09 23:32:50

2010-10-12 14:53:31

mysql索引優化

2017-07-25 12:07:14

MySQL索引SQL

2010-07-05 11:14:32

2010-08-05 13:23:05

NFS協議

2012-01-13 12:57:48

Java

2009-09-28 15:50:53

Hibernate創建持久化Product

2010-08-02 17:24:25

NFS目錄

2023-10-04 11:16:03

數據庫MySQL

2010-05-12 11:14:25

MySQL SQL優化

2024-09-19 08:09:37

MySQL索引數據庫

2018-11-05 15:14:42

MySQL編程語言技術

2018-04-09 14:25:06

數據庫MySQL索引
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩有码一区二区三区 | 中文字幕视频在线观看 | 91精品在线播放 | 国产精品毛片无码 | 成人字幕网zmw | 欧美性tv| 男女国产网站 | 精品视频在线播放 | 国产精品伦一区二区三级视频 | 欧美精品一二三 | 欧美在线观看免费观看视频 | 日日摸夜夜添夜夜添精品视频 | 美女久久久久久久久 | 亚洲精品一区二区三区 | 国产在线激情视频 | 男人av网| 国产在线97| 国产综合在线视频 | 美女三区 | 国产精品美女www爽爽爽 | 免费国产视频 | 夜夜操天天艹 | 91精品国产综合久久久密闭 | 日日夜夜操天天干 | av资源网站 | 天天操天天干天天透 | 久草免费在线视频 | 精品av天堂毛片久久久借种 | 亚洲国产精品成人久久久 | 国产激情一区二区三区 | 久草新在线 | 日本午夜在线视频 | 成人毛片网 | 成人免费一区二区三区牛牛 | 日韩美女一区二区三区在线观看 | 久久久久久网站 | 中文字幕一级毛片视频 | 亚洲精品一区二区在线观看 | 国产做a爱片久久毛片 | 午夜视频在线 | 欧美成人一区二区三区片免费 |