婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 高效利用mysql索引指南

高效利用mysql索引指南

熱門標簽:自己做地圖標注需要些什么 昌德訊外呼系統 電話機器人的價格多少錢一個月 百度地圖標注要什么軟件 中國地圖標注公司 徐涇鎮騰訊地圖標注 天津公司外呼系統軟件 福建外呼電銷機器人加盟 400電話申請廠家現貨

前言

mysql 相信大部分人都用過,索引肯定也是用過的,但是你知道如何創建恰當的索引嗎?在數據量小的時候,不合適的索引對性能并不會有太大的影響,但是當數據逐漸增大時,性能便會急劇的下降。

本篇是對 mysql 索引的一個歸納總結,如果有錯誤的地方,記得評論指出哦。

索引基礎

我們都有都知道查字典的步驟,是先在索引頁中找到這個字的頁碼,然后再到對應的頁碼中查看這個字的信息。mysql 的索引方法也是和這個類似的,先在索引中找到對應值,然后根據匹配的索引記錄找到對應的數據行。假如有下面的 sql 語句:

select * from student where code='2333'

加入 code 列上建立有索引,mysql 將使用該索引找到值為'2333'的數據行,然后讀取數據行的所有數據返回。

索引類型

B-Tree 索引

(不是 B 減樹,就是 B 樹),絕大多數的索引類型都是 B-Tree 的(或者是 B-Tree 的變體),通常我們使用的也是這類索引。Mysql 中 MyISAM 存儲引擎使用的是 B-tree,InnoDB 使用的是 B+Tree,B 樹和 B+樹的區別自行百度。

樹結構的索引能夠加快訪問數據的速度,存儲引擎不再需要全表掃描來獲取所需的數據,取而代之的是從樹的根節點來進行二分搜索,總所周知二分搜索的速度是相當快的,因此我們能夠利用索引來極大的提高查詢速度。B-Tree 支持以下幾種類型的查詢:

假設再 student 表中僅有:name,age,weight 這樣一個多列索引,下面的查詢都能利用到此索引

  • 全值匹配

和索引列中的所有列進行匹配。比如查詢name='abc' and age=12,這里用到了第一列和第二列

  • 匹配最左前列

只是用索引的開頭部分,比如查詢name='ggg'只使用索引的第一列,查詢name='ggg' and age=12是用索引的第一、二列。

  • 匹配列前綴

也可以只匹配某一列的開頭部分,比如查詢name lik 'g%',查詢 name 以 g 開頭的記錄。這里用到了第一列

  • 匹配范圍值

可用于匹配范圍值,比如查詢name > 'abc' and name 'bcd'

  • 精確匹配某一列并范圍匹配另外一列

用于匹配多列,比如查詢name='abc' and age > 12。

總的來看,可以發現 B-Tree 索引適用于根據最左前綴的查找,也就是查詢字段字段順序要和索引字段順序一樣,且以第一個索引字段開頭。比如查詢name,name and age,name and age and weight都能使用索引,但是查詢age,age and name不能使用索引。

哈希索引

hash 索引基于 hash 表實現,只有精確匹配索引所有列才會生效。MySQL 中只有 Memory 引擎顯示支持哈希索引,同時也是其默認索引。

InnoDB 無法創建 hash 索引,但是它有一個功能叫自適應hash索引,當某些索引值使用非常頻繁時,引擎會在內存中基于 B-Tree 索引之上再創建一個 hash 索引,這樣就讓 B-Tree 索引也有了一點 hash 索引的優點。這個功能是一個完全自動的、內部的行為,也就是無法手動控制或配置。

高性能索引策略

下面是一些常見的索引策略。

獨立的列

這個很簡單,如果查詢中的列不是獨立,便無法使用索引,比如:

select * from student where age+1=12

即使 age 列有索引,上面的查詢語句也是無法利用索引的。

前綴索引和索引選擇性

如果需要索引很長的字符串列,直接創建索引,會讓索引占用更多的空間且速度較慢。一個優化策略是模擬 hash 索引:給列計算一個 hash 值,并在 hash 值列建立索引。

另外一個辦法就是建立前綴索引。只索引這個字段開始的部分字符,這樣可以極大的解決空間占用,索引建立速度也會快很多。但是這樣也有如下弊端:

  • 降低了索引選擇性,如果多個字符串前綴相同便無法區分,還需要進行字符串對比。
  • 不支持order by,group by,原因顯而易見,只索引了部分字符,無法完全區分。

這里的關鍵是確定索引多少個字符合適。既要避免長度過大,還要有足夠的索引選擇性。有以下兩種辦法來幫助確定索引字符數:

索引字段前綴數據分布均勻。也就是以索引字符開頭的字符串數目分布均勻,比如索引 name 字段的前 3 個字符,下面的結果是比較合理(只取排名前 8 的):

數目 索引前三個字符
500 abc
465 asd
455 acd
431 zaf
430 aaa
420 vvv
411 asv
512 pdf

如果每一列的數據都比較大,說明區分度還不高需要增大索引字符數,直到這個前綴的選擇性接近完整列的索引性,也就是前面的數據要盡可能的小。

計算完整列的選擇性,并使前綴的選擇性接近于完整列的選擇性。下面語句用戶計算完整列選擇性:

-- 不同字符串的數目/總的數目就是完整列選擇性
select count(distinct name)/count(*) from person;

下面語句計算索引前 3 個字段選擇性:

-- 前3個字符不同的字符串數據/總的數據
select count(distincy left(city,3))/count(*) from person

不斷增大索引字符數目,直到選擇性接近完整列選擇性且繼續增大數據選擇性提升幅度不大的時候。

創建方法

-- 假設最佳長度為4
alter table person add key (name(4));

多列索引

不少人有這樣的誤解,如果一個查詢用有多個字段 ‘and'查詢,那么給每個字段都建立索引不就能最大化提高效率了?事實并不是如此,mysql 只會選擇其中一個字段來進行索引查找。這種情況下應該建立多列索引(又叫聯合索引),就能利用多個索引字段了,注意索引列順序要和查詢的順序一致。

在 5.0 及以上版本中引入了“索引合并”的策略。一定程度上也可以使用多個單列索引,比如下面的查詢:

-- mysql會分別使用name和age索引查出數據然后合并
-- 如果使and則查出數據后再對比取交集
select * from person where name = "bob" or age=12

但是不推薦這么做,and 或 or條件過多會耗費大量的 CPU 和內存在算法的緩存、排序和合并操作上。

選擇合適的索引列順序

在一個多列 B-Tree 索引中,索引列的順序意味著索引首先是按照最左列進行排序,然后是第二列…索引一個良好的多列索引應該是將選擇性最高的索引放在最前面,然后依次降低,這樣才能更好的利于索引。選擇性計算方發見:前綴索引 小節。

聚族索引

聚族索引不是一種單獨的索引類型,而是一種數據存儲方法,具體的細節依賴其實現方式。

InnoDB 的聚族索引實際是在同一個結構中保存索引值和數據行。因為不能同時將數據行放在兩個不同的地方,所以一個表只能有一個聚族索引。InnoDB 的聚族索引列為“主鍵列”。

如果沒有定義主鍵,InnoDB 會選擇一個唯一的非空索引代替。如果這樣的索引也沒有,InnoDB 會隱式定義一個主鍵來作為聚族索引。

聚族索引的主要優點是:可以把相關數據保存在一起,減少磁盤 IO,提高查詢效率。但是也有缺點:

  • 插入順序嚴重依賴于插入順序。按照主鍵的順序插入是速度最快的方式,否則可能會導致頁分裂的問題出現,會占用更多的磁盤空間,掃描速度也會變慢??赏ㄟ^OPTIMIZE TABLE重新組織表。
  • 更新聚族索引列代價很高,因為索引值變了,行數據也會跟著索引移動到新的位置上。
  • 二級索引(非聚族索引)訪問行數據需要兩次索引查找,因為二級索引葉子節點存儲的并不是行數據的物理位置,而是行的主鍵值,再通過主鍵值到聚族索引中取行數據。

覆蓋索引

簡單來說就是一個索引覆蓋了需要查詢的列字段,這樣就不需要再到聚族索引中利用主鍵進行二次查找,在一個二級索引中就能取到所需的數據。

InnoDB 的索引會在葉子節點中保存索引值,因此如果要查詢的字段全部包含在某個索引中,且這個索引被使用了,那么就能極大的提高查詢速度。比如如下查詢語句:

-- name有索引的情況下,直接從索引的葉子節點中取name值返回,無需二次查找
select name from person where name = 'abc'
-- 如果存在`name,age`聚合索引,也會直接返回數據,無需二次查找
select name,age from person where name='abc' and age=12

使用索引進行排序

mysql 的排序操作也是可以利用索引的,只有當索引的列順序和ORDER BY的順序完全一致,并且所有列的排序方法(正序或者倒序)也一樣時,才能夠使用索引來進行排序。注意:排序的字段可以比對應的索引字段少,但是順序必須一致。如下:

-- 假設有:(name,age,sex)聯合索引
-- 可使用索引排序
select ... order by name desc,age desc
select ... order by name desc,age desc,sex desc
-- 不可使用排序
select ... order by name desc,sex desc
select ... order by name desc,age asc

結束

本篇基于 mysql 5.5 的版本,更新的版本可能會有不一樣的策略。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • 新手學習MySQL索引
  • 由不同的索引更新解決MySQL死鎖套路
  • 通過唯一索引S鎖與X鎖來了解MySQL死鎖套路
  • 分享幾道關于MySQL索引的重點面試題
  • Mysql中的索引精講
  • 簡單談談Mysql索引與redis跳表
  • MySQL學習(七):Innodb存儲引擎索引的實現原理詳解
  • 使用shell腳本來給mysql加索引的方法
  • MySQL批量插入和唯一索引問題的解決方法

標簽:梅河口 北京 陜西 黔西 荊門 駐馬店 昌都 鄂爾多斯

巨人網絡通訊聲明:本文標題《高效利用mysql索引指南》,本文關鍵詞  高效,利用,mysql,索引,指南,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《高效利用mysql索引指南》相關的同類信息!
  • 本頁收集關于高效利用mysql索引指南的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久精品久久99精品久久| 国产精品毛片无遮挡高清| 7777精品伊人久久久大香线蕉超级流畅| 99国产一区二区三精品乱码| 国产精品亚洲а∨天堂免在线| 欧美一区二区视频在线观看2022| 久久精品视频网| 成人综合婷婷国产精品久久| 亚洲一区在线观看免费 | 成人中文字幕在线| 制服丝袜成人动漫| 国产精品国产三级国产普通话三级 | 亚洲视频 欧洲视频| 国产精品一二一区| 国产精品久久久久一区二区三区共| 亚洲精品成人天堂一二三| 精品一区二区三区免费毛片爱| 色狠狠综合天天综合综合| 欧美国产综合色视频| 91在线观看下载| 成人精品电影在线观看| 国产精品第一页第二页第三页| 国产精品中文字幕日韩精品| 日韩欧美在线123| 日本一区二区三区久久久久久久久不 | 欧美日韩激情一区二区| 国产不卡视频在线播放| 国产校园另类小说区| 亚洲欧美国产77777| 欧美日韩久久一区二区| 久久精品999| 韩国视频一区二区| 97久久精品人人澡人人爽| 久久精品国产999大香线蕉| 97久久人人超碰| 欧美在线观看一区| 精品在线亚洲视频| 亚洲一区二区视频在线观看| 国产精品国产三级国产a| 亚洲人成在线播放网站岛国| 日本成人中文字幕在线视频| 欧美aa在线视频| 丝袜亚洲另类欧美综合| 日韩一二在线观看| 制服丝袜亚洲色图| 欧美成人性战久久| 成人午夜精品在线| 国产欧美综合色| 亚洲男人天堂一区| 精品久久99ma| 精品美女一区二区| 国产麻豆精品久久一二三| 国产精品一线二线三线精华| 99久久夜色精品国产网站| 日韩av电影天堂| 亚洲大片免费看| 久久婷婷久久一区二区三区| 亚洲3atv精品一区二区三区| 久久精品国产久精国产| 美腿丝袜在线亚洲一区| 亚洲成人免费观看| 亚洲在线视频免费观看| 午夜视频一区二区| 成人精品视频.| 亚洲精品国产无套在线观| 国产a视频精品免费观看| 欧美国产日韩一二三区| 中文字幕精品在线不卡| 91丝袜美腿高跟国产极品老师 | 久久精品国产精品亚洲综合| 午夜精品视频一区| 久久精品国产一区二区三区免费看| 成人污视频在线观看| 337p亚洲精品色噜噜噜| 日韩欧美中文字幕精品| 亚洲女与黑人做爰| 国产激情一区二区三区桃花岛亚洲| 99国产精品99久久久久久| 日韩精品在线一区二区| 亚洲第一av色| 久久久不卡网国产精品一区| 欧美日韩精品一区二区三区蜜桃| 亚洲成人一区二区| 蜜桃av一区二区在线观看| 亚洲欧美电影一区二区| 91视频在线观看| 久久久久久久电影| 成人精品鲁一区一区二区| 成人国产亚洲欧美成人综合网| 亚洲成人激情社区| 99re66热这里只有精品3直播| 91精品欧美综合在线观看最新| 久久99久久精品欧美| 欧美天堂亚洲电影院在线播放| 国产精品视频一二三| 不卡的av中国片| 久久99国产精品免费| 91官网在线免费观看| 日本一区二区三区视频视频| 精品一区二区三区视频| 久久久久99精品国产片| 日韩一区二区三区精品视频 | 亚洲成av人片在www色猫咪| 国产suv精品一区二区883| 国产精一区二区三区| 美女视频黄 久久| 日韩欧美色综合网站| 91福利视频网站| 91老师国产黑色丝袜在线| 亚洲电影你懂得| 日韩视频免费观看高清完整版在线观看 | 樱花草国产18久久久久| 亚洲精品在线观看网站| 99精品久久99久久久久| 色综合久久99| 在线观看视频一区二区欧美日韩| 日韩一级欧美一级| 久久这里只精品最新地址| 亚洲色欲色欲www| 日韩欧美一区二区视频| 亚洲一区二区三区激情| 日日夜夜免费精品视频| 欧美日韩一级视频| 喷水一区二区三区| 中文字幕一区二区三区在线观看| 91麻豆高清视频| 精品视频一区三区九区| 国产精品久久久久久久久免费樱桃| 久久aⅴ国产欧美74aaa| 亚洲二区在线视频| 亚洲综合一区二区| 国产一本一道久久香蕉| gogogo免费视频观看亚洲一| 国产成人av一区| 欧美男人的天堂一二区| 成人在线综合网站| 久久综合色8888| 国产99一区视频免费| 国产成人小视频| 国产精品人妖ts系列视频| 久久91精品国产91久久小草| 精品国产91乱码一区二区三区| 欧美大肚乱孕交hd孕妇| 国产亚洲精品久| 日韩欧美在线123| 国产91精品在线观看| 国模一区二区三区白浆| 久久九九久精品国产免费直播| 成人黄色软件下载| 91视频免费观看| 久久精品夜色噜噜亚洲aⅴ| 久久99精品国产麻豆婷婷洗澡| 国产一区二区按摩在线观看| 国产成人精品三级麻豆| 欧美男同性恋视频网站| 制服丝袜亚洲精品中文字幕| 一区二区日韩av| 国内成人精品2018免费看| 精品一区二区在线播放| 91日韩精品一区| 亚洲韩国一区二区三区| 午夜一区二区三区视频| 中文一区二区完整视频在线观看| 亚洲欧美一区二区三区国产精品| 一本大道久久a久久精二百| 麻豆精品一区二区综合av| 欧美日韩高清一区二区不卡| 欧美va亚洲va| 图片区小说区国产精品视频| 日本不卡视频在线| 国产精品久久久久久久久快鸭 | 成人免费观看av| 奇米色一区二区| 毛片一区二区三区| 国产在线精品一区二区| 色婷婷久久综合| 国产精品成人免费精品自在线观看| 91蜜桃传媒精品久久久一区二区| 中文字幕在线一区二区三区| 99久久er热在这里只有精品15| 欧美在线你懂得| 粉嫩一区二区三区在线看| 亚洲精品高清在线观看| 99久久99久久精品国产片果冻| 国产午夜精品理论片a级大结局| 国产精品资源在线| 国产日韩欧美精品在线| 亚洲综合一区在线| 色婷婷狠狠综合| 国产女同性恋一区二区| 成人的网站免费观看| 欧美日韩中文字幕一区| 91精品国产综合久久精品图片| 捆绑调教美女网站视频一区| 亚洲精品成人a在线观看| 亚洲三级电影网站| 一区二区三区久久久| 亚洲成av人片一区二区三区| 91福利在线播放| 国产精品久久久久影院色老大 |