這是關於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...