<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                一、前綴索引 當字段類型為字符串( varchar , text , longtext 等)時,有時候需要索引很長的字符串,這會讓 索引變得很大,查詢時,浪費大量的磁盤 IO , 影響查詢效率。此時可以只將字符串的一部分前綴,建立索引,這樣可以大大節約索引空間,從而提高索引效率。 1. 語法 create index idx_xxxx on table_name(column(n)) ; 示例: 為 tb_user 表的 email 字段,建立長度為 5 的前綴索引。 create index index_email on tb_user(email(5)); 2. 如何選擇前綴長度 可以根據索引的選擇性來決定,而選擇性是指不重復的索引值(基數)和數據表的記錄總數的比值,索引選擇性越高則查詢效率越高, 唯一索引的選擇性是1 ,這是最好的索引選擇性,性能也是最好的。 下面這里我們看一下案例: select count(distinct email)/count(*) from tb_user; 可以看到上面顯示的是1,也就是說所有的email字段的數據都沒有出現重復,下面我們去從email字段數據去截取前5個字符比較試試看: select count(distinct substring(email,1,5)) / count(*) from tb_user ; 這里我們可以看出出現重復了,但是非重復率還是有0.9583的,如果我們截取前4個或者前6個字符再試試看重復率: #截取前四個 select count(distinct substring(email,1,4)) / count(*) from tb_user ; #截取前6個 select count(distinct substring(email,1,6)) / count(*) from tb_user ; 上面這兩個對比就知道,截取前4個的話重復率變大了,而截取前6個的話重復率不變 ,故最優解就是截取前面前5個即可。 ![](https://img.kancloud.cn/4d/a6/4da619e5b11095f8265cc82bd061d4e9_998x709.png) 3. 前綴索引的查詢流程 前綴索引的查詢流程基本上跟前面講到過的是差不多的,這里會通過我們選擇好的前綴去建立一個輔助索引,在輔助索引上面去找到相對應的索引目標,如果出現重復的話就會先找到第一個重復的索引數據,然后再去進行回表查詢,如果確定完整的字段能夠匹配成功的話就為當前字段,反正繼續遍歷下一個重復的結果。 二、單列索引與聯合索引 這個的話我們前面幾期的內容就接觸過了。 單列索引:即一個索引只包含單個列。 聯合索引:即一個索引包含了多個列。 我們先來看看 tb_user 表中目前的索引情況: 在查詢出來的索引中,既有單列索引,又有聯合索引。 接下來,我們來執行一條SQL語句,看看其執行計劃: explain select id,phone,name from tb_user where phone='17799990000' and name='呂布'; 通過上述執行計劃我們可以看出來,在 and 連接的兩個字段 phone 、 name 上都是有單列索引的,但是最終mysql 只會選擇一個索引,也就是說,只能走一個字段的索引,此時是會回表查詢的。 緊接著,我們再來創建一個 phone 和 name 字段的聯合索引來查詢一下執行計劃。 create unique index idx_user_phone_name on tb_user(phone,name); 此時,查詢時,就走了聯合索引,而在聯合索引中包含 phone、name的信息,在葉子節點下掛的是對應的主鍵id,所以查詢是無需回表查詢的。 如果查詢使用的是聯合索引,具體的結構示意圖如下: 在業務場景中,如果存在多個查詢條件,考慮針對于查詢字段建立索引時,建議建立聯合索引,而非單列索引 。 三、索引設計原則 ``` * 針對于數據量較大,且查詢比較頻繁的表建立索引。 * 針對于常作為查詢條件(where)、排序(order by)、分組(group by)操作的字段建立索 引。 * 盡量選擇區分度高的列作為索引,盡量建立唯一索引,區分度越高,使用索引的效率越高。 * 如果是字符串類型的字段,字段的長度較長,可以針對于字段的特點,建立前綴索引。 * 盡量使用聯合索引,減少單列索引,查詢時,聯合索引很多時候可以覆蓋索引,節省存儲空間, 避免回表,提高查詢效率。 * 要控制索引的數量,索引并不是多多益善,索引越多,維護索引結構的代價也就越大,會影響增刪改的效率。 * 如果索引列不能存儲NULL值,請在創建表時使用NOT NULL約束它。當優化器知道每列是否包含NULL值時,它可以更好地確定哪個索引最有效地用于查詢 ``` 原文鏈接:https://blog.csdn.net/m0_73633088/article/details/137352430
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看