在對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中,可能會對...