提高MySQL索引策略一 隔離查詢列

2021-09-01 15:57:15 字數 1915 閱讀 3667

在mysql中執行查詢時,如果沒有將查詢條件(條件列)隔離出來,那麼查詢引擎則無法利用建立在該列上的索引進行資料獲取.這裡的"隔離"意味著查詢條件字段不能作為表示式的一部分出現,所以,如果在查詢語句中指定表示式條件,就必須單獨將條件列置於表示式的一邊.舉個簡單例子,

select actor_id from sakila.actor where actor_id + 1 = 5;
,mysql無法對上述的actor_id進行索引查詢,儘管從人們能一眼看出actor_id為4,但是mysql不會對該表示式進行計算.這種計算完全靠你來完成的,你應該養成簡化查詢語句的習慣(很多很多),對於這條sql,actor_id應該單獨位於等號的一邊.

這裡有個很常見的例子:

select ... where to_days(current_date) - to_days(date_col) <= 10;
這裡的sql將資料庫中date_col到當前時間10天之內的資料檢索出來,date_col上的索引在這個情況下完全是不可用的,因為to_days()函式式無法利用索引的,可以將檢索條件更改為如下:

select ... where date_col >= date_sub(current_date, interval 10 day);
date_col完全可以利用索引來提高查詢效率.除了這些,還能做的就是將current_date替換為當前時間,我相信上層呼叫都能獲取到當前時間(如果你不要求伺服器時間和mysql時間一致),還有乙個提交current_date的原因是mysql無法對該條sql進行快取,畢竟不同日期sql的執行時間都是不一致的.

上面是high-performance-mysql中的章節翻譯,下面就進行一些簡單的測試(資料50w+,innodb,timestamp索引,字段唯一度0.35),首先是不對查詢列進行隔離.

1.通過條件控制獲取所有資料(588951):

select sql_no_cache count(...) where to_days(current_date) - to_days(update_time) < 100;2.獲取一半資料(276009):

select sql_no_cache count(...) where to_days(current_date) - to_days(update_time) < 60;3.獲取極少部分資料(20161);

select sql_no_cache count(...) where to_days(current_date) - to_days(update_time) < 41;下面是對update_time進行列隔離.

1.通過條件控制獲取所有資料(588951):

select sql_no_cache count(...) where update_time > date_sub(current_date ,interval 100 day);2.獲取一半資料量(288821):

select sql_no_cache count(...) where update_time > date_sub(current_date ,interval 60 day);

3.獲取極少數據(35220):

select sql_no_cache count(...) where update_time > date_sub(current_date ,interval 41 day);
最後把索引去除,進行資料的獲取(不管是資料的多寡),未進行隔離的查詢為1.00s,而進行隔離的查詢為1.10s,所以

可以看出,在有索引的字段上進行條件查詢,最好將該字段至於表示式的一邊,否則索引對於查詢的高效將無法得到發揮(以上的sql執行時間都通過100次計算的平均值得出)

6條策略提高mysql查詢速度

1,表設計一定要優化,冗餘資料最少,少用連線查詢。如果在實際應用中,使用了極其複雜的連線,子查詢,則資料表的設計得要重新考慮了。2,盡量用char而不是varchar,因為固定長度得string用起來更快.在當今硬碟容量越來越大的情況下,犧牲點儲存空間而換得查詢速度得提公升是值得的。3,通過簡化許可...

mysql 查詢優化 (一)索引分類

一,索引分類 普通索引 唯一索引和主索引 1.普通索引 普通索引 由關鍵字key或index定義的索引 的唯一任務是加快對資料的訪問速度。因此,應該只為那些最經常出現在查詢條件 where column 或排序條件 order by column 中的資料列建立索引。只要有可能,就應該選擇乙個資料最...

mysql通過建立分割槽和索引來提高查詢效率

drop table if exists test create table test id int 10 unsigned not null auto increment,time datetime not null comment 業務時間 primary key id time engine ...