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

來源:互聯網
上載者:User

標籤:

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以及索引最佳化--具體一些最佳化方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.