<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    SQL優(yōu)化之你真的會用索引嗎?

    共 1869字,需瀏覽 4分鐘

     ·

    2020-09-26 13:19

    點擊上方SQL數(shù)據(jù)庫開發(fā),關(guān)注獲取SQL視頻教程


    SQL專欄

    SQL基礎(chǔ)知識匯總

    SQL高級知識匯總

    提到索引,想必小伙伴們都知道,它是為了提高查詢效率而生。但是在查詢過程中,怎么才能讓我們的查詢語句使用到索引?相必大家或多或少都會遇到這樣的問題。今天我們就來回答這個問題。



    1

    ? ?聚集索引和非聚集索引


    索引一般分為聚集索引和非聚集索引。

    聚集索引速度很快,但只能建一個,所以盡量把經(jīng)常使用的列建成聚集索引。

    非聚集索引雖然沒聚集索引快,但是可以建多個,比全表掃描快。



    2

    ?如何建立高效的索引


    A.關(guān)聯(lián)條件上建立索引

    例如:
    SELECT ?* FROM ?T1
    JOIN ?T2 ON ?T1.ORDER_ID=T2.ORDER_ID;
    在關(guān)聯(lián)條件ON后面的兩個列就可以分別建立索引,這樣會很快將符合關(guān)聯(lián)條件的數(shù)據(jù)查詢出來。
    B.在條件查詢上建立索引
    例如:
    SELECT * FROM T1?
    WHERE ?T1.PRICE>20;
    在WHERE條件PRICE列上就可以建立索引。
    注意:以下幾種情況不會使用索引
    • 在索引列上使用了運算符的,
      例如:T1.PRICE*0.5>20,這種不會使用索引
    • 在索引列上使用了函數(shù)的,
      例如:UPPER(T1.ADDRESS)='NEWYORK',也不會使用索引
    • 在使用索引時存在空值NULL的,
      例如:T1.ADDRESS IS NULL,那么在查詢時就不會走索引了
    • 字符型數(shù)據(jù)不加引號也不會使用索引
      例如:ORDER_ID原本是字符型,T1.ORDER_ID='112'會使用索引,但是如果去掉引號,變成了T1.ORDER_ID=112,查詢語句不會報錯,但是不會使用索引了。
    • 或(OR)和不等(<>,!=)以及NOT IN等這些也不會使用索引
    • 經(jīng)常使用的LIKE,除了前置匹配,其他匹配均不走索引
      例如:T1.ADDRESS LIKE ‘NEW%’,這個走索引,但是像
      T1.ADDRESS LIKE ‘%NEW%’和T1.ADDRESS LIKE ‘%NEW’則均不走索引了
    • 最后如果查詢優(yōu)化器判斷全表掃描比走索引還快也不會使用到索引。
    C.建立索引的原則
    • 不頻繁寫入和更新的列適合建立索引
    • 經(jīng)常查詢的列適合建立索引
    • 重復數(shù)據(jù)較少的可以建立索引
    D.聯(lián)合索引的妙用
    聯(lián)合索引就是幾個列合在一起組成一個索引,這種在WHERE條件中相比單列索引會起到意想不到效果。
    例如:
    SELECT * FROM T1 WHERE T1.CITY=‘北京’ AND T1.DISTR='海淀區(qū)';
    這個時候?qū)⒘蠧ITY和DISTR建立成一個聯(lián)合索引,效果會更好。
    注意:聯(lián)合索引需要按順序走,如果中間某個索引不能使用,那它之后的列均不會使用索引。
    例如:
    SELECT * FROM T1?
    WHERE T1.CITY=‘北京’
    AND LEFT(T1.DISTR,3)='海淀區(qū)'?
    AND T1.ROAD='#10'
    如果我們將CITY,DISTR,ROAD建立成為聯(lián)合索引,由于索引的前置規(guī)則,只會讓CITY走索引,后面的DISTR因為使用了函數(shù),索引失效,最后的ROAD列因為DISTR的失效也會跟著失效,這里記住即可。



    3

    什么情況不適合建立索引


    由于創(chuàng)建索引和維護索引耗時,時間隨著數(shù)據(jù)的增加而增加,成正比;需要占物理空間;當對表中的數(shù)據(jù)進行維護時,對索引也要進行維護,這樣就降低了數(shù)據(jù)的維護速度?;谶@些缺點,以下情況不適合建立索引

    • 對于在查詢過程中很少使用或參考的列,不應(yīng)該創(chuàng)建索引。

    • 對于那些只有很少數(shù)據(jù)值的列,不應(yīng)該創(chuàng)建索引,例如:性別。

    • 對于那些定義為image,text和bit數(shù)據(jù)類型的列,不應(yīng)該創(chuàng)建索引。

    • 當修改性能遠大于檢索性能,不應(yīng)該建立索引。

    • 重復值較多的也不適合建立索引。


    好了,今天的索引就講到這里,對優(yōu)化感興趣的小伙伴,可以加入我們的微信群,大家一起交流學習。


    ——End——

    后臺回復關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨
    后臺回復關(guān)鍵字:進群,帶你進入高手如云的交流群。
    推薦閱讀
    這是一個能學到技術(shù)的公眾號,歡迎關(guān)注
    點擊「閱讀原文」了解SQL訓練營

    瀏覽 65
    點贊
    評論
    收藏
    分享

    手機掃一掃分享

    分享
    舉報
    評論
    圖片
    表情
    推薦
    點贊
    評論
    收藏
    分享

    手機掃一掃分享

    分享
    舉報

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    亚洲AV无码久久精品蜜桃动态图 | 日本a免费在线观看 | 无码人妻精品一区二区蜜桃在线 | 加勒比综合色 | 国产天堂在线观看 |