91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

MySQL索引的使用問題

數(shù)據(jù)分析與開發(fā) ? 來源:數(shù)據(jù)分析與開 ? 作者:Harvey ? 2021-01-06 16:13 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、前言

在MySQL中進(jìn)行SQL優(yōu)化的時(shí)候,經(jīng)常會(huì)在一些情況下,對MySQL能否利用索引有一些迷惑。譬如:1、MySQL 在遇到范圍查詢條件的時(shí)候就停止匹配了,那么到底是哪些范圍條件?2、MySQL 在LIKE進(jìn)行模糊匹配的時(shí)候又是如何利用索引的呢?3、MySQL 到底在怎么樣的情況下能夠利用索引進(jìn)行排序?今天,我將會(huì)用一個(gè)模型,把這些問題都一一解答,讓你對MySQL索引的使用不再畏懼。

二、知識補(bǔ)充

EXPLAIN執(zhí)行計(jì)劃中有一列 key_len 用于表示本次查詢中,所選擇的索引長度有多少字節(jié),通常我們可借此判斷聯(lián)合索引有多少列被選擇了。在這里 key_len 大小的計(jì)算規(guī)則是:

一般地,key_len 等于索引列類型字節(jié)長度,例如int類型為4 bytes,bigint為8 bytes;

如果是字符串類型,還需要同時(shí)考慮字符集因素,例如:CHAR(30) UTF8則key_len至少是90 bytes;

若該列類型定義時(shí)允許NULL,其key_len還需要再加 1 bytes;

若該列類型為變長類型,例如 VARCHAR(TEXTBLOB不允許整列創(chuàng)建索引,如果創(chuàng)建部分索引也被視為動(dòng)態(tài)列類型),其key_len還需要再加 2 bytes;

三、哪些條件能用到索引

首先非常感謝登博,給了我一個(gè)很好的啟發(fā),我通過他的文章_,然后結(jié)合自己的理解,制作出了這幅圖:

乍一看,是不是很暈,不急,我們慢慢來看圖中一共分了三個(gè)部分:

1、Index Key :MySQL是用來確定掃描的數(shù)據(jù)范圍,實(shí)際就是可以利用到的MySQL索引部分,體現(xiàn)在Key Length。

2、Index Filter:MySQL用來確定哪些數(shù)據(jù)是可以用索引去過濾,在啟用ICP后,可以用上索引的部分。

3、Table Filter:MySQL無法用索引過濾,回表取回行數(shù)據(jù)后,到server層進(jìn)行數(shù)據(jù)過濾。下面我們細(xì)細(xì)展開。Index Key是用來確定MySQL的一個(gè)掃描范圍,分為上邊界和下邊界。MySQL利用=、》=、》 來確定下邊界(first key),利用最左原則,首先判斷第一個(gè)索引鍵值在where條件中是否存在,如果存在,則判斷比較符號,如果為(=,》=)中的一種,加入下邊界的界定,然后繼續(xù)判斷下一個(gè)索引鍵,如果存在且是(》),則將該鍵值加入到下邊界的界定,停止匹配下一個(gè)索引鍵;如果不存在,直接停止下邊界匹配。


		exp:idx_c1_c2_c3(c1,c2,c3)where c1>=1 and c2>2 and c3=1--> first key (c1,c2)--> c1為 '>=' ,加入下邊界界定,繼續(xù)匹配下一個(gè)-->c2 為 '>',加入下邊界界定,停止匹配上邊界(last key)和下邊界(first key)類似,首先判斷是否是否是(=,<=)中的一種,如果是,加入界定,繼續(xù)下一個(gè)索引鍵值匹配,如果是(<),加入界定,停止匹配

		exp:idx_c1_c2_c3(c1,c2,c3)where c1<=1 and c2=2 and c3<3--> last key (c1,c2,c3)--> c1為 '<=',加入上邊界界定,繼續(xù)匹配下一個(gè)--> c2為 '='加入上邊界界定,繼續(xù)匹配下一個(gè)--> c3 為 '<',加入上邊界界定,停止匹配

注:這里簡單的記憶是,如果比較符號中包含‘=’號,‘》=’也是包含‘=’,那么該索引鍵是可以被利用的,可以繼續(xù)匹配后面的索引鍵值;如果不存在‘=’,也就是‘》’,‘《’,這兩個(gè),后面的索引鍵值就無法匹配了。同時(shí),上下邊界是不可以混用的,哪個(gè)邊界能利用索引的的鍵值多,就是最終能夠利用索引鍵值的個(gè)數(shù)。

Index Filter

字面理解就是可以用索引去過濾。也就是字段在索引鍵值中,但是無法用去確定Index Key的部分。


		exp:idex_c1_c2_c3where c1>=1 and c2<=2 and c3 =1index key --> c1index filter--> c2 c3

這里為什么index key 只是c1呢?因?yàn)閏2 是用來確定上邊界的,但是上邊界的c1沒有出現(xiàn)(《=,=),而下邊界中,c1是》=,c2沒有出現(xiàn),因此index key 只有c1字段。c2,c3 都出現(xiàn)在索引中,被當(dāng)做index filter.

Table Filter

無法利用索引完成過濾,就只能用table filter。此時(shí)引擎層會(huì)將行數(shù)據(jù)返回到server層,然后server層進(jìn)行table filter。

四、Between 和Like 的處理

那么如果查詢中存在between 和like,MySQL是如何進(jìn)行處理的呢?

Between

where c1 between ‘a(chǎn)’ and ‘b’ 等價(jià)于 where c1》=‘a(chǎn)’ and c1 《=‘b’,所以進(jìn)行相應(yīng)的替換,然后帶入上層模型,確定上下邊界即可

Like

首先需要確認(rèn)的是%不能是最在最左側(cè),where c1 like ‘%a’ 這樣的查詢是無法利用索引的,因?yàn)樗饕钠ヅ湫枰献钭笄熬Y原則where c1 like ‘a(chǎn)%’ 其實(shí)等價(jià)于 where c1》=‘a(chǎn)’ and c1《‘b’ 大家可以仔細(xì)思考下。

五、索引的排序

在數(shù)據(jù)庫中,如果無法利用索引完成排序,隨著過濾數(shù)據(jù)的數(shù)據(jù)量的上升,排序的成本會(huì)越來越大,即使是采用了limit,但是數(shù)據(jù)庫是會(huì)選擇將結(jié)果集進(jìn)行全部排序,再取排序后的limit 記錄,而且MySQL 針對可以用索引完成排序的limit 有優(yōu)化,更能減少成本。

Make sure it uses index It is very important to have ORDER BY with LIMIT executed without scanning and sorting full result set, so it is important for it to use index – in this case index range scan will be started and query execution stopped as soon as soon as required amount of rows generated.

		CREATE TABLE `t1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c1` int(11) NOT NULL DEFAULT '0', `c2` int(11) NOT NULL DEFAULT '0', `c3` int(11) NOT NULL DEFAULT '0', `c4` int(11) NOT NULL DEFAULT '0', `c5` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `idx_c1_c2_c3` (`c1`,`c2`,`c3`)) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4  select * from t1;+----+----+----+----+----+----+| id | c1 | c2 | c3 | c4 | c5 |+----+----+----+----+----+----+| 1 | 3 | 3 | 2 | 0 | 0 || 2 | 2 | 4 | 5 | 0 | 0 || 3 | 3 | 2 | 4 | 0 | 0 || 4 | 1 | 3 | 2 | 0 | 0 || 5 | 1 | 3 | 3 | 0 | 0 || 6 | 2 | 3 | 5 | 0 | 0 || 7 | 3 | 2 | 6 | 0 | 0 |+----+----+----+----+----+----+7 rows in set (0.00 sec)  select c1,c2,c3 from t1;+----+----+----+| c1 | c2 | c3 |+----+----+----+| 1 | 3 | 2 || 1 | 3 | 3 || 2 | 3 | 5 || 2 | 4 | 5 || 3 | 2 | 4 || 3 | 2 | 6 || 3 | 3 | 2 |+----+----+----+7 rows in set (0.00 sec)

	

存在一張表,c1,c2,c3上面有索引,select c1,c2,c3 from t1; 查詢走的是索引全掃描,因此呈現(xiàn)的數(shù)據(jù)相當(dāng)于在沒有索引的情況下select c1,c2,c3 from t1 order by c1,c2,c3; 的結(jié)果。因此,索引的有序性規(guī)則是怎么樣的呢?c1=3 —》 c2 有序,c3 無序 c1=3,c2=2 — 》 c3 有序 c1 in(1,2) —》 c2 無序 ,c3 無序

有個(gè)小規(guī)律,idx_c1_c2_c3,那么如何確定某個(gè)字段是有序的呢?c1 在索引的最前面,肯定是有序的,c2在第二個(gè)位置,只有在c1 唯一確定一個(gè)值的時(shí)候,c2才是有序的,如果c1有多個(gè)值,那么c2 將不一定有序,同理,c3也是類似

六、小結(jié)

針對MySQL索引,我這邊只是提到了在單表查詢情況下的模型,通過這篇文章,想必大家應(yīng)該了解到MySQL大部分情況下是如何利用索引的。

責(zé)任編輯:xj

原文標(biāo)題:MySQL 的索引是如何工作的?10 分鐘講清楚!

文章出處:【微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    906

    瀏覽量

    29554
  • 索引
    +關(guān)注

    關(guān)注

    0

    文章

    60

    瀏覽量

    10815

原文標(biāo)題:MySQL 的索引是如何工作的?10 分鐘講清楚!

文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    MySQL慢查詢分析與索引調(diào)優(yōu)全流程

    MySQL 性能問題在生產(chǎn)環(huán)境中的表現(xiàn)通常是漸進(jìn)式的:業(yè)務(wù)量增長、數(shù)據(jù)量膨脹,某天突然發(fā)現(xiàn) P99 響應(yīng)時(shí)間從 50ms 漲到 2s。慢查詢是最常見的根因,而索引設(shè)計(jì)不合理又是慢查詢的主要來源。
    的頭像 發(fā)表于 03-06 15:56 ?96次閱讀

    恒訊科技解析:如何安裝MySQL并創(chuàng)建數(shù)據(jù)庫

    安裝和管理MySQL不必復(fù)雜。只需幾分鐘,你就能在Linux服務(wù)器上搭建MySQL,創(chuàng)建第一個(gè)數(shù)據(jù)庫,甚至自動(dòng)化備份——同時(shí)確保數(shù)據(jù)安全有序。 什么是 MySQL? MySQL 是一個(gè)
    的頭像 發(fā)表于 01-14 14:25 ?180次閱讀

    工業(yè)數(shù)據(jù)中臺支持接入MySQL數(shù)據(jù)庫嗎

    工業(yè)數(shù)據(jù)中臺完全支持接入MySQL數(shù)據(jù)庫 ,且通過數(shù)據(jù)同步、集成與治理等技術(shù)手段,能夠充分發(fā)揮MySQL在數(shù)據(jù)存儲(chǔ)與事務(wù)處理方面的優(yōu)勢,同時(shí)彌補(bǔ)其在數(shù)據(jù)分析與共享能力上的不足,具體分析如下: 技術(shù)
    的頭像 發(fā)表于 12-04 11:23 ?381次閱讀
    工業(yè)數(shù)據(jù)中臺支持接入<b class='flag-5'>MySQL</b>數(shù)據(jù)庫嗎

    Hudi系列:Hudi核心概念之索引(Indexs)

    上的Instant action操作類型 ?1.4 時(shí)間線上State狀態(tài)類型 ?1.5 時(shí)間線官網(wǎng)實(shí)例 ?二. 文件布局 ?三. 索引 3.1 簡介 3.2 對比其它(Hive)沒有索引的區(qū)別 3.2
    的頭像 發(fā)表于 10-21 09:47 ?397次閱讀
    Hudi系列:Hudi核心概念之<b class='flag-5'>索引</b>(Indexs)

    MySQL性能優(yōu)化實(shí)戰(zhàn)

    你是否遇到過這些場景:凌晨3點(diǎn)被告警電話吵醒,數(shù)據(jù)庫CPU飆到100%?一條簡單的查詢語句要跑30秒?明明加了索引,查詢還是慢如蝸牛?
    的頭像 發(fā)表于 09-17 16:19 ?516次閱讀

    MySQL慢查詢終極優(yōu)化指南

    作為一名在生產(chǎn)環(huán)境摸爬滾打多年的運(yùn)維工程師,我見過太多因?yàn)槁樵儗?dǎo)致的線上故障。今天分享一套經(jīng)過實(shí)戰(zhàn)檢驗(yàn)的MySQL慢查詢分析與索引優(yōu)化方法論,幫你徹底解決數(shù)據(jù)庫性能瓶頸。
    的頭像 發(fā)表于 08-13 15:55 ?856次閱讀

    CentOS 7下MySQL 8雙主熱備高可用架構(gòu)全解

    Centos7部署MySQL8+keepalived雙主熱備(含Keepalived配置與GTID同步優(yōu)化方案) 架構(gòu)拓?fù)湓?GTID同步 VIP 192.168.1.100 MySQL主節(jié)點(diǎn)1
    的頭像 發(fā)表于 08-12 17:08 ?834次閱讀

    MySQL配置調(diào)優(yōu)技巧

    上個(gè)月,我們公司的核心業(yè)務(wù)系統(tǒng)突然出現(xiàn)大面積超時(shí),用戶投訴電話不斷。經(jīng)過緊急排查,發(fā)現(xiàn)是MySQL服務(wù)器CPU飆升到99%,大量慢查詢堆積。通過一系列配置調(diào)優(yōu)和SQL優(yōu)化,最終在30分鐘內(nèi)恢復(fù)了服務(wù)。
    的頭像 發(fā)表于 07-31 10:27 ?624次閱讀

    MySQL 8.0性能優(yōu)化實(shí)戰(zhàn)指南

    作為一名運(yùn)維工程師,MySQL數(shù)據(jù)庫優(yōu)化是我們?nèi)粘9ぷ髦凶罹咛魬?zhàn)性的任務(wù)之一。MySQL 8.0作為當(dāng)前主流版本,在性能、安全性和功能上都有了顯著提升,但如何充分發(fā)揮其潛力,仍需要我們掌握正確的優(yōu)化策略。
    的頭像 發(fā)表于 07-24 11:48 ?863次閱讀

    MySQL的組成結(jié)構(gòu)與結(jié)構(gòu)化查詢語言詳解

    MySQL作為世界上最流行的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),采用了分層架構(gòu)設(shè)計(jì)
    的頭像 發(fā)表于 07-14 11:21 ?652次閱讀

    MySQL數(shù)據(jù)備份與恢復(fù)策略

    數(shù)據(jù)是企業(yè)的核心資產(chǎn),MySQL作為主流的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),其數(shù)據(jù)的安全性和可靠性至關(guān)重要。本文將深入探討MySQL的數(shù)據(jù)備份策略、常用備份工具以及數(shù)據(jù)恢復(fù)的最佳實(shí)踐,幫助運(yùn)維工程師構(gòu)建完善的數(shù)據(jù)保護(hù)體系。
    的頭像 發(fā)表于 07-14 11:11 ?743次閱讀

    企業(yè)級MySQL數(shù)據(jù)庫管理指南

    在當(dāng)今數(shù)字化時(shí)代,MySQL作為全球最受歡迎的開源關(guān)系型數(shù)據(jù)庫,承載著企業(yè)核心業(yè)務(wù)數(shù)據(jù)的存儲(chǔ)與處理。作為數(shù)據(jù)庫管理員(DBA),掌握MySQL的企業(yè)級部署、優(yōu)化、維護(hù)技能至關(guān)重要。本文將從實(shí)戰(zhàn)角度出發(fā),系統(tǒng)闡述MySQL在企業(yè)環(huán)
    的頭像 發(fā)表于 07-09 09:50 ?735次閱讀

    MySQL數(shù)據(jù)庫是什么

    MySQL數(shù)據(jù)庫是一種 開源的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS) ,由瑞典MySQL AB公司開發(fā),后被Oracle公司收購。它通過結(jié)構(gòu)化查詢語言(SQL)進(jìn)行數(shù)據(jù)存儲(chǔ)、管理和操作,廣泛應(yīng)用于Web
    的頭像 發(fā)表于 05-23 09:18 ?1224次閱讀

    MySQL簡介與理論基礎(chǔ)

    MySQL是世界上最流行的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,廣泛應(yīng)用于網(wǎng)站、應(yīng)用程序和企業(yè)級系統(tǒng)。它采用客戶端/服務(wù)器架構(gòu),支持多用戶環(huán)境,并基于SQL(結(jié)構(gòu)化查詢語言)標(biāo)準(zhǔn)。
    的頭像 發(fā)表于 05-21 10:43 ?748次閱讀

    除了增刪改查你對MySQL還了解多少

    我們都知道MySQL服務(wù)器的默認(rèn)端口為3306,之后就在這個(gè)端口號上等待客戶端進(jìn)程進(jìn)行連接(MySQL服務(wù)器會(huì)默認(rèn)監(jiān)聽3306端口)。
    的頭像 發(fā)表于 04-14 17:20 ?738次閱讀