<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
上一篇整理完了 MySQL 的效能優化方式 , 其中最常用的就是 explain .
這一篇來詳細看看 explain 中各個引數的含義和擴充套件 , 整理出來便於使用時快速查詢
在日常實踐中 , 我們應該如何使用 explain 提供的查詢來判斷索引怎麼設定呢?
以一個實際業務場景為例 : 首先場景裡面的資料分佈都很均衡 , 這就導致設定的索引在查詢優化器的處理下 , 很難產生最好的效果.
先來看一下表結構 :
CREATE TABLE `user_info` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵id', `user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '會員ID', `user_no` bigint(20) NOT NULL DEFAULT '0' COMMENT '會員編號', `open_id` varchar(128) NOT NULL DEFAULT '' COMMENT '外部ID', `org_id` varchar(128) NOT NULL DEFAULT '0' COMMENT '組織ID', `listen_num` int(11) NOT NULL DEFAULT '0' COMMENT '記錄次數', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間', `create_person` varchar(50) NOT NULL DEFAULT '' COMMENT '建立人', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間', `update_person` varchar(50) NOT NULL DEFAULT '' COMMENT '更新人', PRIMARY KEY (`id`), KEY `idx_user_id` (`user_id`), KEY `idx_org_id_open_id` (`org_id`,`open_id`) USING BTREE, KEY `idx_create_time` (`create_time`) USING BTREE, KEY `idx_update_time` (`update_time`) USING BTREE ) COMMENT='會員記錄表';
需要獲取到記錄次數 (listen_num) > 0 使用者的會員編號 (user_no)
(A/B/C/D)
, 每種資料預計佔25% - 30%
修改後會更新 update_time
基礎資訊
// 1. 總記錄數 4200000 // 2. 不同 org_id 下的記錄數 - 1234567890 : 100萬 - 9876543210 : 100萬 - 8888888888 : 100萬 - 6666666666 : 100萬 - 其他 : 20萬 // 3. 時間週期 > 2022-01 > 2022-12
listen_num 本身沒有建立索引 , 以該欄位查肯定會走全表 , 優先考慮的思路就是 > user_id
為條件進行有序查詢 :
explain select * from user_info where user_id > 69999887 and listen_num > 0
這裡看起來好像萬事大吉 , 你看索引不是生效了嗎 , 只掃描了16行 ,nice!
但是 , 回想一下 B+Tree 的原則 , 在節點裡面搜尋條件是由小到大有序排列的 , 而帶了這個 user_id 處 , 實際上已經快結束了 , 查詢優化器理所當然的選擇了通過 idx_user_id 進行查詢
如果以開始ID做查詢條件 ,可以發現實際上索引沒有生效 , 而型別也是全表
explain select * from user_info where user_id > 10000025 and listen_num > 0
總結 : 當索引欄位遍佈整個資料範圍 , 且查詢很分散的時候 , 在前排序區間的資料可能會放棄使用索引
既然二級索引裡面是有序 , 那麼以時間作為查詢條件是不是最好的 ?
EXPLAIN SELECT * FROM user_info WHERE update_time > "2022-08-03 01:04:55" AND update_time < "2022-09-03 01:04:55" AND listen_num > 0 LIMIT 100
這裡看起來就很不錯了 , 查詢行數和索引都使用的很理想. 但是這裡面會有一個致命的問題 , 如果是大批次資料查詢 , 那麼這裡一定會出現深度分頁的問題
首先資料結構的特點是什麼? >> 四個組織分佈很平均 , 也就是說如果 org_id 生效 ,我們至少可以只儲存四分之一的查詢量
EXPLAIN SELECT * FROM user_info WHERE org_id = "123" and update_time > "2022-08-03 01:04:55" AND update_time < "2022-09-03 01:04:55" and listen_num > 0 LIMIT 100
初步總結
通過以上三個案例 , 基本上就可以看出 explain 的基本用法
要記住的一點是 , 索引並不是我們以為的樣子 ,當多個索引同時存在的時候 , MySQL 會根據情況進行選擇. 比如 :
EXPLAIN SELECT * FROM user_info WHERE org_id = "1234567890" and update_time > "2022-08-03 01:04:55" AND update_time < "2022-08-04 01:04:55" and listen_num > 0 LIMIT 100
如果這裡把時間週期拉長 , 那麼結果也會相應的轉變 :
EXPLAIN SELECT * FROM user_info WHERE org_id = "1234567890" and update_time > "2022-08-03 01:04:55" AND update_time < "2022-09-04 01:04:55" and listen_num > 0 LIMIT 100
連表查詢中主要關注的屬性是 filtered , 來實際來看看這個屬性 :
// org 是個很簡單的表 , org_id 即對於其ID EXPLAIN SELECT * FROM user_info as u , org as o WHERE org_id = "123" and u.org_id = o.id
explain 的結果並不能作為最終決策行為 , explain 是執行計劃 , 計劃和實際是會存在偏差的, 畢竟 explain 沒有真的執行.
哪怕我們最終只需要100行 , 按照 ID 排序的情況下只查幾行 , 實際上執行計劃的 row 仍然會很龐大.
explain 主要作為參考 , 在實際使用中 , 需要更多的經驗思考. 可能最終的結果和explain的不一致.
例如上面的案例 , 按照 explain 的做法 , 用短時間週期最好 ,其次應該是 org_id .
但是根據業務場景 ,我會選擇通過 > id 的方式迴圈查. 一個是業務原因 ,查詢的量大 , 上述兩種方式都不能避免深度翻頁的問題.
到此這篇關於MySQL中explain使用快速查詢手冊的文章就介紹到這了,更多相關MySQL explain快速查詢手冊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
<高效能MySQL>
<MySQL 是怎樣執行的:從根兒上理解 MySQL>
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45