標籤:
max()的最佳化
例如:explain select max(`payment_date`) from payment; 可以查看到row的行數非常的多,也就是說掃描了整張表。
為payment_date加上一個索引。
create index idx_payment on payment (`payment_date`);
執行sql語句 explain select max(`payment_date`) from payment order by payment_date; 可以看到rows為null。
extra: select tables optinized away;
並沒有掃描整個表,只是通過索引拿出。
索引是通過順序排列的,所以,通過索引的統計資訊就非常清楚的知道,最後一個payment_date的數值是什麼樣子的。因此並不需要對錶的操作,這樣就大大的增加了這條sql的執行效率,同時儘可能大的減少了IO操作,這樣的話,不管資料量有多大,執行效率基本上是恒定的。
思路:對於max()的查詢,可以通過索引的方式來最佳化它。
count(*)和count(num)的區別
如果num某行為null,count(num)是不包含在內的。而count(*)這是會包含在內的。這就是為什麼有時會出現差異的原因。
例如:
id num
1 1
2 2
3 null
count(*)=3 但是 count(id)=2
子查詢的最佳化
子查詢用串連方式查詢時要注意是否是1對多的關係,如果是,資料結果就會出現重複,需要用distinct去重。
limit()最佳化
最佳化步驟1:使用有索引的列或者主鍵的列進行order by操作。道理和max()一樣。
最佳化步驟2:記錄上次返回的主鍵,在下次查詢時使用主鍵過濾。
例如:select file_id,description from file where file_id >55 and file_id <= 60 order by film_id limit 1,5;
這種做法的缺點是萬一主鍵缺失的情況下,拿出來的就不一定是5條了。
d=====( ̄▽ ̄*)b 中心最佳化思想:避免資料量大時掃描過多的記錄。
小螞蟻學習mysql效能最佳化(4)--SQL以及索引最佳化--具體一些最佳化方法