小螞蟻學習mysql性能優化(4)--SQL以及索引優化--具體一些優化方法

max()的優化sql

例如:explain select max(`payment_date`)  from payment; 能夠查看到row的行數很是的多,也就是說掃描了整張表。優化

爲payment_date加上一個索引。索引

create index idx_payment on payment (`payment_date`);ip

執行sql語句    explain select max(`payment_date`) from payment order by payment_date; 能夠看到rows爲null。it

extra:    select tables optinized away;io

並無掃描整個表,只是經過索引拿出。table

索引是經過順序排列的,因此,經過索引的統計信息就很是清楚的知道,最後一個payment_date的數值是什麼樣子的。所以並不須要對錶的操做,這樣就大大的增長了這條sql的執行效率,同時儘量大的減小了IO操做,這樣的話,無論數據量有多大,執行效率基本上是恆定的。效率

思路:對於max()的查詢,能夠經過索引的方式來優化它。date

count(*)和count(num)的區別file

若是num某行爲null,count(num)是不包含在內的。而count(*)則是會包含在內的。這就是爲何有時會出現差別的緣由。

例如:

    id            num

    1                1

    2                2

    3                null

count(*)=3  可是 count(num)=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 中心優化思想:避免數據量大時掃描過多的記錄。

相關文章
相關標籤/搜索