php mysql 索引 mysql的索引優化

2021-10-17 13:15:35 字數 2613 閱讀 6935

mysql官方對索引的定義:索引是幫助mysql高效獲取資料的資料結構。索引是在儲存引擎中實現的,所以每種儲存引擎中的索引都不一樣。如myisam和innodb儲存引擎只支援btree索引;memory和heap儲存引擎可以支援hash和btree索引。

這裡僅針對常用的innodb儲存引擎所支援的btree索引進行介紹:

一、索引型別

先建立乙個新錶,用於演示索引型別

create table index_table (

id bigint not null auto_increment comment '主鍵',

name varchar (10) comment '姓名',

age int comment '年齡',

phonenum char (11) comment '手機號',

primary key (id)

) engine = innodb auto_increment = 1 default charset = utf8;

下圖是col2為索引列,記錄與b樹結構的對應圖,僅供參考:

1、普通索引

這是最基本的索引,沒有任何限制。

------直接建立索引

create index index_name on index_table(name);

2、唯一索引

索引列的值必須唯一,可以有空值

---------直接建立唯一索引

create unique index index_phonenum on index_table(phonenum);

3、主鍵

是一種特殊的唯一索引,必須指定為 primary key,如我們常用的auto_increment自增主鍵

4、多列索引

也稱為組合索引,就是在多個欄位上聯合建立乙個索引

-------直接建立組合索引

create index index_union on index_table(name,age,phonenum);

這裡乙個組合索引,相當於在有如下三個索引:

name;

name,age;

name,age,phonenum;

這裡或許有這樣乙個疑惑:為什麼age或者age,phonenum欄位上沒有索引。這是由於btree索引因要遵守最左字首原則,這個原則在後面詳細展開。

二、索引優化

1、選擇索引列

建立索引簡單,但是在哪些列上建立索引則需要好好思考。可以考慮在where字句**現列或者join字句**現的列上建索引

select

age----不使用索引

from

index_union

where

name = 'xiaoming'---考慮使用索引

and phonenum = '18668247687';---考慮使用索引

2、最左字首原則

聯合索引(name,age,phonenum) ,b+樹是按照從左到右的順序來建立搜尋樹的。如('張三',18,'18668247652')來檢索資料的時候,b+樹會優先匹配name來確定搜尋方向,name匹配成功再依次匹配age、phonenum,最後檢索到最終的資料。也就是說這種情況下是有**索引,當name相同,查詢age,age也相同時,去比較phonenum;但是如果拿 (18,'18668247652')來檢索時,b+樹沒有拿到一級索引,根本就無法確定下一步的搜尋方向。('張三','18668247652')這種場景也是一樣,當name匹配成功後,沒有age這個二級索引,只能在name相同的情況下,去遍歷所有的phonenum。

b+樹的資料結構決定了在使用索引的時候必須遵守最左字首原則,在建立聯合索引的時候,盡量將經常參與查詢的字段放在聯合索引的最左邊。

3、like的使用

一般情況下不建議使用like操作,如果非使用不可的話,需要注意:like '%abd%'不會使用索引,而like 『aaa%』可以使用索引。這也是前面的最左字首原則的乙個使用場景。

4、不能使用索引說明

mysql會按照聯合索引從左往右進行匹配,直到遇到範圍查詢,如:>, 3 and d = 4,如果建立(a,b,c,d)順序的索引,d是不會使用索引的。但如果聯合索引是(a,b,d,c)的話,則a b d c都可以使用到索引,只是最終c是乙個範圍值。

5、order by

order by排序有兩種排序方式:using filesort使用演算法在記憶體中排序以及使用mysql的索引進行排序;我們在部分不情況下希望的是使用索引。

如果id是單列索引,則order by會使用索引

如果id是單列索引,name不是索引或者name也是單列索引,則order by不會使用索引。因為mysql的一次查詢只會從眾多索引中選擇乙個索引,而這次查詢中使用的是id列索引,而不是name列索引。在這種場景下,如果想讓order by也使用索引的話,就建立聯合索引(id,name),這裡需要注意最左字首原則,不要建立這樣的聯合索引(name,id)。

最後需要注意mysql對排序記錄的大小有限制:max_length_for_sort_data 預設為1024;也就意味著如果需要排序的資料量大於1024,則order by不會使用索引,而是使用using filesort。

php mysql索引問題 php基礎

顯然這是乙個凡是使用mysql的朋友都會遇到的問題。回憶一下當初在配置環境時提到的mysql gui工具,對了,就是它,大家可以到中找到它。因為sunec也只是一名程式愛好者,遠沒有達到程式設計師水平,所以借助一些工具的幫助還是很有必要的 相信一些朋友也和我一樣 用gui工具建立表,建立ref欄位,...

php mysql查詢 php查詢mysql的例項

php查詢mysql的例項 背景 從mysql查詢各字段值輸出並且按照條件用紅色字型顯示滿足條件字段值。條件 1.syntime小於當前前一周時間的話顯示紅色。2.a欄位為 無 的話,顯示紅色。3.b欄位為 無 的話,顯示紅色。圖一資料庫結構 圖二資料庫各字段值 我的 我只滿足了第乙個條件,其餘兩個...

php mysql 日誌 MySQL日誌管理

任何一種資料庫中,都有各種各樣的日誌。mysql也不例外,在mysql中有4種不同的日誌 分別錯誤日誌 二進位制日誌 查詢日誌和慢查詢日誌。這些日誌記錄著mysql資料庫不同方面的蹤跡。下文將介紹這4種不同的日誌作用和用途。一.錯誤日誌 錯誤日誌在mysql資料庫中很重要,它記錄著mysqld啟動和...