日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sql优化之b+树锁引实战

發(fā)布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sql优化之b+树锁引实战 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

索引的代價

空間上的代價

一個索引都為對應(yīng)一棵B+樹,樹中每一個節(jié)點(diǎn)都是一個數(shù)據(jù)頁,一個頁默認(rèn)會占用16KB的存儲空間,所以一個索引也是會占用磁盤空間的。

時間上的代價

索引是對數(shù)據(jù)的排序,那么當(dāng)對表中的數(shù)據(jù)進(jìn)行增、刪、改操作時,都需要去維護(hù)修改內(nèi)容涉及到的B+樹索引。

所以在進(jìn)行增、刪、改操作時可能需要額外的時間進(jìn)行一些記錄移動,頁面分裂、頁面回收等操作來維護(hù)好排序。

B+樹鎖引實(shí)戰(zhàn)

全值匹配

select?*?from?t1?where?b =?1?and c?=?1?and?d =?1;

查詢優(yōu)化器會分析這些查詢條件并且按照可以使用的索引中列的順序來決定先使用哪個查詢條件。

匹配左邊的列

select?*?from?t1?where?b =?1;

select?*?from?t1?where?b =?1?and c?=?1;

下面這個sql是用不到索引的

select?*?from?t1?where c?=?1;

因?yàn)锽+樹先是按照b列的值排序的,在b列的值相同的情況下才使用c列進(jìn)行排序,也就是說b列的值不同的記錄中c的值可能是無序的。而現(xiàn)在你跳過b列直接根據(jù)c的值去查找,這是做不到的。

匹配列前綴

如果只給出后綴或者中間的某個字符串,比如:

select?*?from?t1?where?b?like?'%101%';

這種是用不到索引的,因?yàn)樽址虚g有'101'的字符串并沒有排好序,所以只能全表掃描了。有時候我們有一些匹配某些字符串后綴的需求,比方說某個表有一個url列,該列中存儲了許多url:

www.baidu.com

www.google.com

www.qq.com

假設(shè)已經(jīng)對該url列創(chuàng)建了索引,如果我們想查詢以com為后綴的網(wǎng)址的話可以這樣寫查詢條件:WHERE url LIKE'%com',但是這樣的話無法使用該url列的索引。為了在查詢時用到這個索引而不至于全表掃描,我們可以把后綴查詢改寫成前綴查詢,不過我們就得把表中的數(shù)據(jù)全部逆序存儲一下,也就是說我們可以這樣保存url列中的數(shù)據(jù):

moc.udiab.www

moc.elgoog.www

moc.qq.www

這樣再查找以com為后綴的網(wǎng)址時搜索條件便可以這么寫:WHERE url LIKE 'moc%',這樣就可以用到索引了。

匹配范圍值

select?*?from?t1?where?b >?1?and?b <?20000;

由于B+樹中的數(shù)據(jù)頁和記錄是先按b列排序的,所以我們上邊的查詢過程其實(shí)是這樣的:

找到b值為1的記錄。

找到b值為20000的記錄。

由于所有記錄都是由鏈表連起來的(記錄之間用單鏈表,數(shù)據(jù)頁之間用雙鏈表),所以他們之間的記錄都可以很容易的取出來找到這些記錄的主鍵值,再到聚簇索引中回表查找完整的記錄。不過在使用聯(lián)合進(jìn)行范圍查找的時候需要注意,如果對多個列同時進(jìn)行范圍查找的話,只有對索引最左邊的那個列進(jìn)行范圍查找的時候才能用到B+樹索引,比如:

select?*?from?t1?where?b >?1?and c?>?1;

上邊這個查詢可以分成兩個部分:

1. 通過條件b > 1來對b進(jìn)行范圍,查找的結(jié)果可能有多條b值不同的記錄,

2. 對這些b值不同的記錄繼續(xù)通過c > 1繼續(xù)過濾。

這樣子對于聯(lián)合索引來說,只能用到b列的部分,而用不到c列的部分,因?yàn)橹挥衎值相同的情況下才能用c列的值進(jìn)行排序,而這個查詢中通過b進(jìn)行范圍查找的記錄中可能并不是按照c列進(jìn)行排序的,所以在搜索條件中繼續(xù)以c列進(jìn)行查找時是用不到這個B+樹索引的。

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

對于同一個聯(lián)合索引來說,雖然對多個列都進(jìn)行范圍查找時只能用到最左邊那個索引列,但是如果左邊的列是精確查找,則右邊的列可以進(jìn)行范圍查找,比方說這樣:

select?*?from?t1?where?b =?1?and c?>?1;

排序

select?*?from?t1?order by?b,?c, d;

這個查詢的結(jié)果集需要先按照b值排序,如果記錄的b值相同,則需要按照c來排序,如果c的值相同,則需要按照d排序。因?yàn)檫@個B+樹索引本身就是按照上述規(guī)則排好序的,所以直接從索引中提取數(shù)據(jù),然后進(jìn)行回表操作取出該索引中不包含的列就好了。

分組

select?b,?c, d,?count(*)?from?t1?group by?b,?c, d;

這個查詢語句相當(dāng)于做了3次分組操作:

1. 先把記錄按照b值進(jìn)行分組,所有b值相同的記錄劃分為一組。

2. 將每個b值相同的分組里的記錄再按照c的值進(jìn)行分組,將title值相同的記錄放到一個分組里。

3. 再將上一步中產(chǎn)生的分組按照d的值分成更小的分組。如果沒有索引的話,這個分組過程全部需要在內(nèi)存里實(shí)現(xiàn),而如果有索引的話,正好這個分組順序又和B+樹中的索引列的順序是一致的,所以可以直接使用B+樹索引進(jìn)行分組。

使用聯(lián)合索引進(jìn)行排序或分組的注意事項(xiàng)

對于聯(lián)合索引有個問題需要注意,ORDER BY的子句后邊的列的順序也必須按照索引列的順序給出,如果給出order by c, b, d?的順序,那也是用不了B+樹索引的。

同理,?order by b? order by b, c?這種匹配索引左邊的列的形式可以使用部分的B+樹索引。當(dāng)聯(lián)合索引左邊列的值為常量,也可以使用后邊的列進(jìn)行排序,比如這樣:

select?*?from?t1?where?b =?1?order by c, d;

這個查詢能使用聯(lián)合索引進(jìn)行排序是因?yàn)閎列的值相同的記錄是按照c, d排序的。

不可以使用索引進(jìn)行排序或分組的幾種情況

ASC、DESC混用

對于使用聯(lián)合索引進(jìn)行排序的場景,我們要求各個排序列的排序順序是一致的,也就是要么各個列都是ASC規(guī)則排序,要么都是DESC規(guī)則排序。

ORDER BY子句后的列如果不加ASC或者DESC默認(rèn)是按照ASC排序規(guī)則排序的,也就是升序排序的。

select?*?from?t1?order by?b?ASC,?c DESC;

這個查詢是用不到索引的。

如何建立索引

考慮索引選擇性

索引的選擇性(Selectivity),是指不重復(fù)的索引值(也叫基數(shù),Cardinality)與表記錄數(shù)的比值:

選擇性 = 基數(shù) /記錄數(shù)

選擇性的取值范圍為(0, 1],選擇性越高的索引價值越大。如果選擇性等于1,就代表這個列的不重復(fù)值和表記錄數(shù)是一樣的,那么對這個列建立索引是非常合適的,如果選擇性非常小,那么就代表這個列的重復(fù)值是很多的,不適合建立索引。

考慮前綴索引

用列的前綴代替整個列作為索引key,當(dāng)前綴長度合適時,可以做到既使得前綴索引的選擇性接近全列索引,同時因?yàn)樗饕齥ey變短而減少了索引文件的大小和維護(hù)開銷。

使用mysql官網(wǎng)提供的示例數(shù)據(jù)庫:
https://dev.mysql.com/doc/employee/en/employees-installation.html

github地址:
https://github.com/datacharmer/test_db.git

employees表只有一個索引,那么如果我們想按名字搜索一個人,就只能全表掃描了:

EXPLAIN SELECT?*?FROM?employees.employees?WHERE?first_name='Eric'?AND

last_name='Anido';

那么可以對或建立索引,看下兩個索引的選擇性:

SELECT count(DISTINCT(first_name))/count(*)?AS?Selectivity?FROM?employees.employees;?-

- 0.0042

SELECT count(DISTINCT(concat(first_name, last_name)))/count(*)?AS?Selectivity?FROM

employees.employees;?-- 0.9313

顯然選擇性太低,選擇性很好,但是fifirst_name和last_name加起來長度為30,有沒有兼顧長度和選擇性的辦法?

可以考慮用fifirst_name和last_name的前幾個字符建立索引,例如,看看其選擇性:

SELECT count(DISTINCT(concat(first_name,?left(last_name,?3))))/count(*)?AS?Selectivity

FROM?employees.employees;?-- 0.7879

選擇性還不錯,但離0.9313還是有點(diǎn)距離,那么把last_name前綴加到4:

SELECT count(DISTINCT(concat(first_name,?left(last_name,?4))))/count(*)?AS?Selectivity

FROM?employees.employees;?-- 0.9007

這時選擇性已經(jīng)很理想了,而這個索引的長度只有18,比短了接近一半,建立前綴索引的方式為:

ALTER TABLE?employees.employees?ADD INDEX?`first_name_last_name4` (first_name,

last_name(4));

前綴索引兼顧索引大小和查詢速度,但是其缺點(diǎn)是不能用于ORDER BY和GROUP BY操作,也不能用于覆蓋索引。

總結(jié)

  • 索引列的類型盡量小
  • 利用索引字符串值的前綴
  • 主鍵自增
  • 定位并刪除表中的重復(fù)和冗余索引
  • 盡量使用覆蓋索引進(jìn)行查詢,避免回表帶來的性能損耗。

分享就到這里啦,喜歡的朋友們點(diǎn)贊,收藏,加關(guān)注哦!領(lǐng)取資料后臺私聊小編:即可免費(fèi)領(lǐng)取!

總結(jié)

以上是生活随笔為你收集整理的sql优化之b+树锁引实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久久99精品免费观看 | 成人精品毛片 | 精品欧美一区二区三区久久久 | 最新三级网站 | 无码人妻精品丰满熟人区 | 日b视频免费观看 | 日av一区 | 精品一区在线 | 国产乱码精品一区二区三区忘忧草 | 亚洲av无码乱码在线观看性色 | 最新激情网 | 欧美区亚洲区 | 国产在线aaa | 91在线免费视频 | 国产精品亚洲二区在线观看 | 樱桃成人精品视频在线播放 | 国产一级二级三级 | 国产激情久久久 | 国产美女精品久久 | 亚洲天堂日本 | www.色婷婷.com| 被两个男人吃奶三p爽文 | 精品久久久久久久久久久久久久久久久久 | 久久福利片 | 我的丝袜美腿尤物麻麻 | а中文在线天堂 | 国产小毛片 | 久久久精品动漫 | 亚洲校园激情 | 野花视频免费在线观看 | 亚洲免费三区 | 国产又黄又大又粗视频 | 国产一区二区高清视频 | 美女100%无挡 | 午夜91视频| 四虎影成人精品a片 | 午夜亚洲福利在线老司机 | 亚洲巨乳在线 | 艳母动漫在线播放 | 91视频啪啪| 一色道久久88加勒比一 | 精品国产乱码久久久久久蜜臀网站 | 中文字幕超碰在线 | 樱桃视频污污 | 四虎黄色 | 精品久久久无码中文字幕 | 日本在线不卡一区二区三区 | 99精品热视频 | 欧美在线观看www | 日韩av男人的天堂 | 人妻精品一区一区三区蜜桃91 | 超碰成人免费电影 | 粗大的内捧猛烈进出 | 久久av免费看 | 激情欧美一区二区三区精品 | 精品视频大全 | 梦梦电影免费高清在线观看 | 伊人免费 | 国产精品久久777777换脸 | 岳乳丰满一区二区三区 | 亚洲中文字幕无码一区二区三区 | 国产美女视频一区二区 | 日韩在线一区二区三区四区 | 久久只有这里有精品 | 国产大片91 | 欧美一区二区日韩一区二区 | 亚洲精品成人无码毛片 | 欧美人与性动交ccoo | 69久久精品无码一区二区 | 久久艹av | 日韩av中文字幕在线免费观看 | 日本少妇高潮 | 久久中文字幕高清 | 成人福利视频在线 | 天天干导航 | 在线观看免费av网址 | 久久成人免费视频 | 成人久久在线 | 秋霞影院午夜伦 | 国产欧美一区二区精品性色 | 麻豆理论片 | 欧美日韩99 | 精品久久久久一区二区 | 中文在线а√在线 | 欧美日韩资源 | 三级av毛片 | 蜜桃精品噜噜噜成人av | 日韩av免费在线播放 | 永久免费在线观看av | 精品无码一区二区三区免费 | 精品久久久久久久久久久久久久 | 天堂在线观看视频 | 丁香六月欧美 | 久久精品牌麻豆国产大山 | 美女18毛片 | 2020自拍偷拍 | 亚洲综合成人网 | 日本午夜啪啪 | 奇米精品一区二区三区在线观看 |