MySql效能調優 索引

2022-04-19 10:26:14 字數 3560 閱讀 8339

在對mysql的查詢語句優化過程中,我們最常用的手段就是新增索引,可見索引對資料庫優化的重要性,下面就說一說在優化過程中,索引的一些用法,鑑於本人水平有限,可能會有一些說得不對的地方,歡迎指正。

下面例子中需要使用1張表,表結構如下:

create table `order` (

`order_id` int(11) not null comment,

`order_serial` varchar(20) not null comment,

`pay_money` decimal(11,2) not null default '0.00' comment,

`order_status` tinyint(4) not null default '1' comment,

`shop_id` int(11) not null comment,

`time_stamp` timestamp not null default current_timestamp on update current_timestamp,

primary key (`order_id`)

) engine=innodb default charset=utf8;

我們來看一下這個語句

select *

from `order`

where order_serial = '000011610250002';

通過explain命令分析,如圖:

通過分析結果,可以看出,這個查詢語句進行了全表掃瞄。現在我們給order_serial字段新增索引,

alter table `order` add index order_serial(order_serial);
再使用explain命令分析,如圖:

從結果可以看出,新增經索引後,該查詢語句使用了索引,並且只需要讀取一行資料,而沒有優化之前,卻需要讀取10萬行資料,這就是索引的魅力。

當查詢語句中,能夠使用的索此不至1個時,mysql會通過分析每個可以使用的索引的統計資訊來找到最高效的索引。基數越高,表示該列的唯一值越多,使用該索引讀取的資料越少。為了演示例子, 我們再將order表的shop_id字段新增索引。

alter table `order` add index shop_id(shop_id);
使用explain分析如下查詢語句

select *

from `order`

where shop_id = 7 and order_serial = '000011610250002';

結果如圖:

我們發現雖然有2個可以使用的索引,但是使用的是索引order_serial,為什麼呢?我們來看一下這兩個索引基數,執行如下語句:

show index from `order`;
我們看一下列cardinality的值,這個值表示索引基數。可以看出索引order_serial的基數比shop_id的基數大很多,也就是說使用索引order_serial更優。

當然,一般來說在執行查詢語句時,乙個表只會選擇乙個索引,但從5.0開始,也可能出現索引合併操作。

我們再新增乙個索引order_status

alter table `order` add index order_status(order_status);
使用explain分析下面查詢語句

select *

from `order`

where shop_id = 7 and order_status = 3;

我們再來看看另外一種情況使用explain分析下面查詢語句(說明:-7這個shop_id不存在)

select *

from `order`

where shop_id = -7 and order_status = 3;

使用explain分析下面查詢語句(說明:-3這個order_status不存在)

可以看出,雖然是同樣的sql語句,只是值不一樣,結果所使用的索引也不一樣,所以具體使用那個索引,基數大小是乙個重要的指標,但是mysql也會參考具體條件的範圍與容量等資訊。(當然,我這個例子舉得不是特別的好,主要是為了說明這個問題

)為了演示多列索引,我們執行以下操作

alter table `order` 

add index shop_id_order_status(shop_id,order_status)

,drop index order_status

,drop index shop_id;

為了提高dml語句的執行效率,我們應該合併執行語句

使用explain分析下面查詢語句

select *

from `order`

where

1=1and shop_id = 7

and order_status = 3;

使用explain分析下面查詢語句

select *

from `order`

where

1=1and shop_id = 7

-- and order_status = 3;

使用explain分析下面查詢語句

通過上面執**況,我們發現,多列索引中最左邊的列,可以當成單列索引來使用。

當然索引還有很多要說的,比如索引的重複的問題(多列索引中,將最左邊的列又單獨建立乙個索引,這就是索引重複,不斷沒有帶來好處,還多出了一些額外的開銷),比如區域性索引,等等。

mysql效能調優3 索引相關

眾所周知,索引可以加快查詢的速度,但有的時候你的乙個小不注意索引就失效。本博文結合例項追根究底研究索引。前置條件 為表達效果,請按本人部落格 mysql效能調優1 博文往supan表中插入7000萬資料。注意設定innodb flush log at trx commit 2,否則插入7000萬資料...

mysql效能調優

1.對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。2.應盡量避免在where子句中對字段進行null判斷,否則會導致引擎放棄使用索引而進行全表掃瞄。3.應盡量避免在where子句中使用 或 操作符,否則會導致引擎放棄使用索引而進行全表掃瞄。4...

Mysql效能調優

mysql 效能調優有很多方面,主要是這幾個方面 1 正規化 是指表的列具有原子性,不可再拆分,只要資料庫是線性的,都自動滿足1nf。2 正規化 表中的紀錄是唯一的。3 正規化 表中資料不應該有冗餘,如果通過某個欄位就能得到跟該字段相關的資訊,就沒必要將這些資訊,再存放到該表中。在3nf中,可能會對...