在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

MySQL索引的使用問題

數(shù)據(jù)分析與開發(fā) ? 來源:數(shù)據(jù)分析與開 ? 作者:Harvey ? 2021-01-06 16:13 ? 次閱讀

一、前言

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

二、知識補充

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

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

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

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

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

三、哪些條件能用到索引

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

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

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

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

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


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

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

注:這里簡單的記憶是,如果比較符號中包含‘=’號,‘》=’也是包含‘=’,那么該索引鍵是可以被利用的,可以繼續(xù)匹配后面的索引鍵值;如果不存在‘=’,也就是‘》’,‘《’,這兩個,后面的索引鍵值就無法匹配了。同時,上下邊界是不可以混用的,哪個邊界能利用索引的的鍵值多,就是最終能夠利用索引鍵值的個數(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呢?因為c2 是用來確定上邊界的,但是上邊界的c1沒有出現(xiàn)(《=,=),而下邊界中,c1是》=,c2沒有出現(xiàn),因此index key 只有c1字段。c2,c3 都出現(xiàn)在索引中,被當(dāng)做index filter.

Table Filter

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

四、Between 和Like 的處理

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

Between

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

Like

首先需要確認(rèn)的是%不能是最在最左側(cè),where c1 like ‘%a’ 這樣的查詢是無法利用索引的,因為索引的匹配需要符合最左前綴原則where c1 like ‘a(chǎn)%’ 其實等價于 where c1》=‘a(chǎn)’ and c1《‘b’ 大家可以仔細(xì)思考下。

五、索引的排序

在數(shù)據(jù)庫中,如果無法利用索引完成排序,隨著過濾數(shù)據(jù)的數(shù)據(jù)量的上升,排序的成本會越來越大,即使是采用了limit,但是數(shù)據(jù)庫是會選擇將結(jié)果集進行全部排序,再取排序后的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 無序

有個小規(guī)律,idx_c1_c2_c3,那么如何確定某個字段是有序的呢?c1 在索引的最前面,肯定是有序的,c2在第二個位置,只有在c1 唯一確定一個值的時候,c2才是有序的,如果c1有多個值,那么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)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    849

    瀏覽量

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

    關(guān)注

    0

    文章

    59

    瀏覽量

    10632

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

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

收藏 人收藏

    評論

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

    使用插件將Excel連接到MySQL/MariaDB

    使用插件將 Excel 連接到 MySQL/MariaDB 適用于 MySQL 的 Devart Excel 插件允許您將 Microsoft Excel 連接到 MySQL 或 MariaDB
    的頭像 發(fā)表于 01-20 12:38 ?539次閱讀
    使用插件將Excel連接到<b class='flag-5'>MySQL</b>/MariaDB

    適用于MySQL和MariaDB的.NET連接器

    支持 ORM 的適用于 MySQL 和 MariaDB 的 .NET 連接器 dotConnect for MySQL 是一種高性能 ADO.NET 數(shù)據(jù)提供程序,可在開發(fā) MySQL 的應(yīng)用程序
    的頭像 發(fā)表于 01-16 14:17 ?400次閱讀
    適用于<b class='flag-5'>MySQL</b>和MariaDB的.NET連接器

    MySQL數(shù)據(jù)庫的安裝

    MySQL數(shù)據(jù)庫的安裝 【一】各種數(shù)據(jù)庫的端口 MySQL :3306 Redis :6379 MongoDB :27017 Django :8000 flask :5000 【二】MySQL 介紹
    的頭像 發(fā)表于 01-14 11:25 ?506次閱讀
    <b class='flag-5'>MySQL</b>數(shù)據(jù)庫的安裝

    創(chuàng)建唯一索引的SQL命令和技巧

    在創(chuàng)建唯一索引時,以下是一些SQL命令和技巧,可以幫助優(yōu)化性能: 使用合適的索引類型:對于需要保證唯一性的列,使用UNIQUE索引來避免重復(fù)數(shù)據(jù)的插入。 這可以確保列中的值是唯一的,同時提高查詢效率
    的頭像 發(fā)表于 01-09 15:21 ?396次閱讀

    MySQL還能跟上PostgreSQL的步伐嗎

    Percona 的老板 Peter Zaitsev最近發(fā)表一篇博客,討論了MySQL是否還能跟上PostgreSQL的腳步。Percona 作為MySQL 生態(tài)扛旗者,Percona 開發(fā)了知名
    的頭像 發(fā)表于 11-18 10:16 ?509次閱讀
    <b class='flag-5'>MySQL</b>還能跟上PostgreSQL的步伐嗎

    香港云服務(wù)器怎么部署MySQL數(shù)據(jù)庫?

    在香港云服務(wù)器上部署MySQL數(shù)據(jù)庫的步驟如下: 步驟 1: 更新軟件包列表 首先,確保軟件包列表是最新的。在終端中執(zhí)行以下命令: sudo apt update 步驟 2: 安裝 MySQL
    的頭像 發(fā)表于 11-14 16:15 ?476次閱讀

    詳解MySQL多實例部署

    詳解MySQL多實例部署
    的頭像 發(fā)表于 11-11 11:10 ?579次閱讀

    MySQL編碼機制原理

    前言 一位讀者在本地部署 MySQL 測試環(huán)境時碰到一個問題,我覺得挺有代表性的,所以寫篇文章介紹一下,看完相信你會對 MySQL 的編碼機制有最本質(zhì)的了解,本文的目錄結(jié)構(gòu)如下 讀者問題簡介
    的頭像 發(fā)表于 11-09 11:01 ?533次閱讀

    適用于MySQL的dbForge架構(gòu)比較

    dbForge Schema Compare for MySQL 是一種工具,用于輕松有效地比較和部署 MySQL 數(shù)據(jù)庫結(jié)構(gòu)和腳本文件夾差異。該工具提供了 MySQL 數(shù)據(jù)庫架構(gòu)中所有差異的全面視圖。
    的頭像 發(fā)表于 10-28 09:41 ?520次閱讀
    適用于<b class='flag-5'>MySQL</b>的dbForge架構(gòu)比較

    配置MySQL主從復(fù)制和讀寫分離

    配置MySQL主從復(fù)制和讀寫分離
    的頭像 發(fā)表于 10-23 11:44 ?764次閱讀
    配置<b class='flag-5'>MySQL</b>主從復(fù)制和讀寫分離

    MATLAB中的矩陣索引

    對矩陣進行索引是從矩陣中選擇或修改部分元素的一種方式。MATLAB 有幾種索引樣式,它們不僅功能強大、靈活,而且可讀性強、表現(xiàn)力強。矩陣是 MATLAB 用來組織和分析數(shù)據(jù)的一個核心組件,索引是以可理解的方式有效操作矩陣的關(guān)鍵。
    的頭像 發(fā)表于 09-05 09:28 ?992次閱讀
    MATLAB中的矩陣<b class='flag-5'>索引</b>

    Jtti:MySQL初始化操作如何設(shè)置root密碼

    MySQL初始化時,可以通過以下步驟設(shè)置root密碼: 打開命令行工具,使用以下命令啟動MySQL服務(wù): ? sudo service mysql start ? 使用以下命令登錄MySQL
    的頭像 發(fā)表于 08-08 16:45 ?759次閱讀

    MySQL知識點匯總

    大家好,這部分被稱為DQL部分,是每個學(xué)習(xí)MySQL必須要學(xué)會的部分,下面就讓我來介紹MySQL中的其他部分。
    的頭像 發(fā)表于 08-05 15:27 ?611次閱讀
    <b class='flag-5'>MySQL</b>知識點匯總

    一文了解MySQL索引機制

    接觸MySQL數(shù)據(jù)庫的小伙伴一定避不開索引索引的出現(xiàn)是為了提高數(shù)據(jù)查詢的效率,就像書的目錄一樣。 某一個SQL查詢比較慢,你第一時間想到的就是“給某個字段加個索引吧”,那么
    的頭像 發(fā)表于 07-25 14:05 ?527次閱讀
    一文了解<b class='flag-5'>MySQL</b><b class='flag-5'>索引</b>機制

    華納云:如何修改MySQL的默認(rèn)端口

    MySQL是世界上最流行的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一。在某些情況下,由于安全性、網(wǎng)絡(luò)策略或端口沖突的原因,數(shù)據(jù)庫管理員可能需要更改MySQL服務(wù)的默認(rèn)監(jiān)聽端口。本文將指導(dǎo)您如何在不同的操作系統(tǒng)上
    的頭像 發(fā)表于 07-22 14:56 ?493次閱讀
    華納云:如何修改<b class='flag-5'>MySQL</b>的默認(rèn)端口
    主站蜘蛛池模板: 国产免费午夜 | 成人国产三级在线播放 | 日本xx69| 成人最新午夜免费视频 | 日本aaaaa高清免费看 | 伊人亚洲综合网成人 | 精品免费久久久久久成人影院 | 日本不卡在线观看免费v | 国产精品免费视频拍拍拍 | h色小视频 | 欧美色视频在线观看 | 人人舔| 久久综合成人网 | 国产婷婷色一区二区三区深爱网 | 九九热精品在线 | 午夜剧j | 男女一级特黄a大片 | 亚洲精品你懂的 | 日韩特黄特色大片免费视频 | 国产深夜福利在线观看网站 | 亚洲电影天堂网 | 成人网在线视频 | 伊人久久大香线蕉观看 | 丁香六月婷婷七月激情 | 黄色国产在线观看 | 国产逼逼视频 | 亚洲视频三区 | 午夜啪啪福利视频 | 午夜欧美福利视频 | 狠狠色噜噜狠狠狠狠奇米777 | 久久久久久久国产精品电影 | 四虎国产成人亚洲精品 | 狠狠色噜噜狠狠狠狠98 | 亚洲人成网站色7799在线观看 | 色中色软件 | 色播影院性播免费看 | 第四色激情 | 久久久久久久网站 | 国产精品美女免费视频观看 | 91亚色视频在线观看 | 欧美 亚洲 国产 精品有声 |