簡述一下索引的匹配原則 mysql索引詳解

2021-10-14 15:50:04 字數 2231 閱讀 3275

這是關於php高階到架構之mysql高階學習的第篇文章:mysql索引詳解

第一篇:mysql共享鎖及排它鎖第二篇:mysql事務及隔離級別第三篇:mysql底層btree與b+tree實現原理第四篇:mysql索引詳解

什麼是列的雜湊性呢?

比如user(使用者表)中的username欄位,該列的雜湊性是多少呢?

第一步:查詢該列不重複的個數

counta = select count(distinct username) from user

第二步:查詢**的行數countb = select count(*) from user

第三步:username的雜湊值

username欄位的雜湊值 = counta/countb

雜湊性值越大,作為索引的效果越好。

比如user表的status狀態值取0或1,為何status不做索引呢?

原因就是status的雜湊值比較低。

對索引中關鍵字進行對比,一定是從左往右依次進行,且不可跳過比如下面的user表

create table `user` (`id` int (11) not null auto_increment,`name` varchar (255) default null,`score` int (11) default null,primary key (`id`),key `name_score` (`name`, `score`)) engine = innodb auto_increment = 8 default charset = utf8
user表中id為主鍵索引,name_score(name,score)為多列索引

執行下面的sql語句

索引型別為index。你可能會疑問最左匹配原則,應該不使用索引才對,為何使用索引了呢?

index:這種型別表示是mysql會對整個該索引進行掃瞄。

要想用到這種型別的索引,對這個索引並無特別要求,只要是索引,或者某個復合索引的一部分,mysql都可能會採用index型別的方式掃瞄。

但是呢,缺點是效率不高,mysql會從索引中的第乙個資料乙個個的查詢到最後乙個資料,直到找到符合判斷條件的某個索引。

explain select * from `user` where score=100 and name='tom'
執行結果如下:

type為ref,表示使用了索引name_score(name,score)

大家可能會疑問查詢條件where score=100 and name='tom'是先查詢score然後查詢name,不是不滿足最左原則嗎?

其實where score=100 and name='tom'和where name='tom' and score=100本質是一樣的,mysql內部的優化器會

將where score=100 and name='tom'

調整為where name='tom' and score=100

如果查詢列可通過索引節點中的關鍵字直接返回,則該索引稱之為覆蓋索引。覆蓋索引可減少資料庫io,將隨機io變為順序io,可提高查詢效能

例:

create index name_score on user(name,score);select name,score from user where name = "gofor";
在索引的子節點命中了 返回的列,就不需要再繼續往b+tree的底部葉子節點 讀取資料了,減少了io操作,提高了查詢速度。

這就是為什麼不建議select * from table 的原因,需要什麼列就查什麼列,可能會命中覆蓋索引,這樣就會極大的提高查詢效率。

匹配列字首可用到索引 like ***%,like %***%、like %***大部分情況用不到索引(覆蓋索引除外);

簡述MySQL聯合索引最左匹配原則

在網上看過一些有關最左匹配原則的部落格,自以為自己理解了,但是今天面試的時候被面試官深挖了一下,就暴露了其實並沒有真正理解到最左匹配原則。mysql在建立聯合索引的時候,會從左到右依次建立遞增的索引。而且也比較推薦建立聯合索引,因為乙個索引可以起到很多個索引的作用。create table inde...

mysql響一下 linux下安裝mysql

注意 該安裝採用的系統是centos版本,centos版本下,安裝mysql實際上安裝的是mariadb。有關於什麼是mariadb。首先,檢視你的目錄下是否已經安裝了mariadb,輸入命令 rpm qa grep i mariadb 如果已經安裝,需要先解除安裝。輸入命令 rpm ev 檔名 1...

介紹一下索引

根據資料庫的功能,可以在 資料庫設計器中建立四種索引 普通索引 唯一索引 主鍵索引和 聚集索引。有關資料庫所支援的索引功能的詳細資訊,請參見資料庫文件。普通索引 這是最基本的索引型別,而且它沒有唯一性之類的限制。普通索引可以通過以下幾種方式建立 建立索引,例如create index 索引的名字 o...