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

從MySQL優化的角度來看:數據庫回表與索引

數據庫 MySQL
本文從數據庫MySQL優化的角度來看數據庫的回表與索引,快來看看是否對你有幫助!

回表的概念

先得出結論,根據下面的實驗。如果我要獲得['liu','25']這條記錄。需要什么步驟。

  • 1.先通過['liu']記錄對應到普通索引index(name),獲取到主鍵id:4.
  • 2.再通過clustered index,定位到行記錄。也就是上面說的這條['liu','25']記錄數據。

因此,上述就是說的回表查詢,先定位主鍵值,再定位行記錄。多掃了一遍索引樹。

當然,也就多耗費了CPU,IO,內存等。

1.stu_info表案例

  1. create table stu_info ( 
  2.  id int primary key
  3.  name varchar(20), 
  4.  age int
  5.  index(name

2.查看剛剛建立的表結構

  1. mysql> show create table stu_info\G; 
  2. *************************** 1\. row *************************** 
  3.        Table: stu_info 
  4. Create TableCREATE TABLE `stu_info` ( 
  5.   `id` int(11) NOT NULL
  6.   `namevarchar(20) COLLATE utf8_bin DEFAULT NULL
  7.   `age` int(11) DEFAULT NULL
  8.   PRIMARY KEY (`id`), 
  9.   KEY `name` (`name`) 
  10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin 
  11. 1 row in set (0.00 sec) 

3.插入測試數據

  1. insert into stu_info values(1,'zhang',20); 
  2. insert into stu_info values(4,'liu',25); 
  3. insert into stu_info values(7,'huang',19); 
  4. insert into stu_info values(10,'allen',27); 
  5. insert into stu_info values(30,'benjiemin',27); 
  6. insert into stu_info values(16,'roger',27);   
  7. insert into stu_info values(28,'peter',16); 
  8. commit 

4.分析過程

我們來分析這幾條數據的索引。由于我們name這個列建立了索引。所以name索引存儲會按照【a~z】順序排列。通過select語句,可以得到一些感性認識。如下:

  1. mysql> select name from stu_info; 
  2. +-----------+ 
  3. name      | 
  4. +-----------+ 
  5. | allen     | 
  6. | benjiemin | 
  7. | huang     | 
  8. | liu       | 
  9. | peter     | 
  10. | roger     | 
  11. | zhang     | 
  12. +-----------+ 

上述的普通索引secondary index在B+樹存儲格式可能如下:

根據舊金山大學提供的可視化B+tree的效果。

其可視化地址為:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html

如下圖:

從MySQL優化的角度來看:數據庫回表與索引

我在根據上面的圖,畫一個自己的。如下圖所示:

從MySQL優化的角度來看:數據庫回表與索引

也能看到name這幾個數據建立的B+樹是怎么樣的。也能看到我需要找到[liu]這個元素的話,需要兩次查找。

但是,如果我的需求是,除了獲取name之外還需要獲取age的話。這里就需要回表了。為什么?因為我找不到age數據。

  • 普通索引的葉子節點,只存主鍵。

那么clustered index聚集索引是如何保存的呢?繼續使用上述可視化工具,再分析一波。

從MySQL優化的角度來看:數據庫回表與索引

上圖是聚集索引的示意圖。轉化為我的圖如下:

從MySQL優化的角度來看:數據庫回表與索引

所以,name='liu'查詢liu的年齡,是需要回表的。首先查詢普通索引的B+樹,再查詢聚集索引的B+樹。最后得到liu的那條行記錄。

5.執行計劃

我們也可以通過執行計劃來分析一下,如下:

  1. mysql> explain select id,name,age from stu_info where name='liu'\G; 
  2. *************************** 1\. row *************************** 
  3.            id: 1 
  4.   select_type: SIMPLE 
  5.         table: stu_info 
  6.          type: ref 
  7. possible_keys: name 
  8.           keyname 
  9.       key_len: 63 
  10.           ref: const 
  11.          rows: 1 
  12.         Extra: Using index condition 
  13. 1 row in set (0.00 sec) 

看到Using index condition,我們這里用到了回表。

如果不取age,只取id和name的話,那么。就不需要回表。如下實驗,繼續看執行計劃:

  1. mysql> explain select id,name from stu_info where name='liu'\G; 
  2. *************************** 1\. row *************************** 
  3.            id: 1 
  4.   select_type: SIMPLE 
  5.         table: stu_info 
  6.          type: ref 
  7. possible_keys: name 
  8.           keyname 
  9.       key_len: 63 
  10.           ref: const 
  11.          rows: 1 
  12.         Extra: Using where; Using index 
  13. 1 row in set (0.00 sec) 

那么,如果我們不想回表,不想多做IO的話。我們可以通過建立組合索引來解決這個問題。通過

  1. ALTER TABLE stu_info DROP INDEX  name;   
  2. alter table stu_info add key(name,age); 

我們再繼續看執行計劃,如下:

  1. mysql> explain select name,age from stu_info where name='liu'\G; 
  2. *************************** 1\. row *************************** 
  3.            id: 1 
  4.   select_type: SIMPLE 
  5.         table: stu_info 
  6.          type: ref 
  7. possible_keys: name 
  8.           keyname 
  9.       key_len: 63 
  10.           ref: const 
  11.          rows: 1 
  12.         Extra: Using where; Using index 
  13. 1 row in set (0.00 sec) 

可以看到額外信息是Using where; Using index而不是Using index condition也就沒有用到回表了。

 

責任編輯:龐桂玉 來源: 今日頭條
相關推薦

2020-02-14 18:10:40

MySQL索引數據庫

2010-06-04 11:28:05

MySQL數據庫

2010-05-21 12:15:52

2018-06-26 15:58:06

數據庫MySQL索引優化

2019-05-17 10:57:09

Mysql數據庫運維

2011-03-08 08:49:55

MySQL優化單機

2011-07-18 15:59:17

MySQL數據庫

2011-07-06 10:49:50

MySQL優化

2011-07-06 14:12:20

MySQLPercona

2015-06-02 16:16:17

mysql優化mysql讀寫分離mysql主從復制

2018-05-14 16:14:56

數據庫MySQL分表與分區

2010-05-26 13:42:08

MySQL數據庫索引

2010-05-21 10:01:11

MySQL數據庫

2011-03-03 17:56:52

MySQL數據庫優化

2016-12-12 13:07:57

數據庫優化SQL

2010-04-23 11:32:22

Oracle數據庫

2019-12-18 08:00:09

MySQL數據庫ORDER BY

2010-05-21 14:01:23

MySQL數據庫

2010-10-13 11:54:00

MySQL數據庫表

2013-01-04 10:00:12

MySQL數據庫數據庫查詢優化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美色性 | 欧美视频 亚洲视频 | 精品国产一区二区三区观看不卡 | 欧美中文字幕在线观看 | 久久久这里只有17精品 | 日本在线网站 | 在线观看视频91 | 超级碰在线 | 狠狠躁夜夜躁人人爽天天高潮 | 成人免费观看网站 | 日韩一区二区在线播放 | 二区三区在线观看 | 欧美性猛交一区二区三区精品 | 黄色大片在线视频 | 请别相信他免费喜剧电影在线观看 | 中文精品视频 | 91社区在线观看播放 | 国产一区中文字幕 | 99热国产精品| 日本午夜免费福利视频 | 欧美aⅴ在线观看 | 91国内外精品自在线播放 | 毛片a区| 伊人久操 | 免费骚视频 | 国产一二三区精品视频 | 亚洲精品黄色 | 欧美精品在线一区 | 中文字幕日韩欧美一区二区三区 | 久久久久久国产精品免费免费 | 人人干人人舔 | 一本大道久久a久久精二百 国产成人免费在线 | 一区精品在线观看 | 色片在线观看 | 亚洲人成在线观看 | 国产精品久久 | 久草免费在线视频 | 亚洲精品一区在线观看 | 中文字幕在线观看www | 国产免费播放视频 | a级片www|