高性能的索引实现——《深究MySQL》
本篇主要總結(jié)的使索引更高效的方式
1.獨(dú)立的列
獨(dú)立的列,指的是建了索引的列不能在sql查詢語(yǔ)句中進(jìn)行計(jì)算。不然索引會(huì)失效。
錯(cuò)誤示例:
select * from user where user_id +1 =11;
select * from user DATE(create_date) > ‘2017-10-10’;如果create_date建了索引,該索引會(huì)失效。
2.前綴索引和索引選擇性
2.1 前綴索引
定義:數(shù)據(jù)列太長(zhǎng)時(shí),我們可以選取字段開始的幾個(gè)字符來(lái)作為索引,這樣的索引就叫前綴索引。
優(yōu)點(diǎn):可以節(jié)約索引空間,從而提高索引效率。
缺點(diǎn):會(huì)降低索引的選擇性。Mysql無(wú)法使用前綴索引做group by 和order by,也無(wú)法做覆蓋掃描。
創(chuàng)建前綴索引:Alter table 表名 Add key(city(7))。city是需要建前綴索引列,7是前綴索引的長(zhǎng)度。
前綴索引長(zhǎng)度的選取:select count(distinct left(city, 4))/count() as sel4, count(distinct left(city, 5))/count() as sel5 from 表名 。通過(guò)這種方式可得出不同長(zhǎng)度的前綴索引得到的選擇性,選擇性越大越好。單在增加前綴索引長(zhǎng)度的情況下,選擇性變化不大時(shí),就沒(méi)必要增加前綴索引的長(zhǎng)度了。
※ 像Blob、Text或很長(zhǎng)的varchar類型的列,Mysql會(huì)強(qiáng)制使用前綴索引,而不允許將整個(gè)列的數(shù)據(jù)長(zhǎng)度做為索引長(zhǎng)度。
※ 如果我們想給類似電子郵箱這種數(shù)據(jù)做索引,可以通過(guò)將郵箱反轉(zhuǎn)后存儲(chǔ),然后再建立前綴索引。
2.2 索引的選擇性:不重復(fù)的索引值(也稱基數(shù))與數(shù)據(jù)表記錄總數(shù)的比值。比值越大越好。唯一索引的選擇為1,此時(shí)性能最好。
計(jì)算某列索引選擇性的方式:Select count(distinct 列名 )/ count(*) from 表名
3. 聚集索引(聚簇索引)
聚集索引不是單獨(dú)的索引類型,而是InnoDB引擎存儲(chǔ)數(shù)據(jù)的方式。
更多參考:http://blog.csdn.net/superhosts/article/details/25611119
聚集索引的節(jié)點(diǎn)頁(yè)只存儲(chǔ)了索引列,葉子頁(yè)存儲(chǔ)了全部數(shù)據(jù)(包括主鍵、事務(wù)ID、用于事務(wù)和MVCC的回滾指針),可以說(shuō)是InnoDB**通過(guò)主鍵聚集數(shù)據(jù)**。
4. 覆蓋索引
定義:一個(gè)包含所有要查詢字段值的索引。即通過(guò)查詢索引就能查到所有值。
例:select 列1, 列2 from 表名?,F(xiàn)在給這兩列建立一個(gè)復(fù)合索引fuhe_index,那么我們就可以說(shuō)fuhe_index索引覆蓋了要查詢的兩列。
如果只查詢主鍵,二級(jí)索引就能覆蓋查詢,因?yàn)槎?jí)索引的頁(yè)節(jié)點(diǎn)存儲(chǔ)的就是主鍵。
我們知道limit會(huì)先查出所有滿足條件的數(shù)據(jù),然后截取幾條。如果我們查詢的字段太多,就會(huì)浪費(fèi)時(shí)間和性能。要是我們只查詢主鍵,相當(dāng)于用了覆蓋索引,這樣的查詢就快很多。于是我們就可以通過(guò)覆蓋索引先查出主鍵這一個(gè)字段,再根據(jù)主鍵查詢需要的數(shù)據(jù)。如:
select * from pro inner join (select id from pro where pro2.c2=’M’ limit 10000, 10) as pro2 ON pro2.id = pro.id
總結(jié)
以上是生活随笔為你收集整理的高性能的索引实现——《深究MySQL》的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 优化MySQL数据类型——《深究MySQ
- 下一篇: MySQL的查询性能优化——《深究MyS