最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL字符串索引更合理的創(chuàng)建規(guī)則討論

 更新時間:2019年11月22日 14:59:29   作者:風雨之間  
這篇文章主要給大家介紹了關于MySQL字符串索引更合理的創(chuàng)建規(guī)則,文中通過示例代碼介紹的非常詳細,對大家學習或者使用MySQL具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

針對使用MySQL的索引,我們之前介紹過索引的最左前綴規(guī)則,索引覆蓋,唯一索引和普通索引的使用以及優(yōu)化器選擇索引等概念,今天我們討論下如何更合理的給字符串創(chuàng)建索引。

如何更好的創(chuàng)建字符串索引

我們知道,MySQL中,數據和索引都是在一顆 B+樹 上,我們建立索引的時候,這棵樹所占用的空間越小,檢索速度就會越快,而varchar格式的字符串有些會很長,那么在效率為上的今天,我們如何更加合理的建立字符串的索引呢?
假如說我們一張表中存在 email 字段,現在要給 email 字段創(chuàng)建索引,email 字段值的格式為:zhangsan@qq.com。

有2種建立索引的方式:

1、直接給 email 字段建立索引:alter table t add index index1(email);

索引樹結構為:

2、建立 email 的前綴索引:alter table t add index index2(email(6));

索引數據結構為:

此時我們的查詢語句為:select id,name,email from t where email='zhangsh123@xxx.com';

當使用index1索引時其執(zhí)行步驟為:

1、從index1索引樹查找索引值為zhangsh123@xxx.com的主鍵值ID1;

2、根據ID1回表查到該行數據確實為zhangsh123@xxx.com,將結果加入結果集;

3、繼續(xù)查找index1索引樹下一個索引值是否滿足zhangsh123@xxx.com,不滿足則結束查詢。

當使用index2索引時其執(zhí)行步驟為:

1、從index2索引樹查找索引值為zhangs的主鍵值ID1;

2、根據ID1回表查到該行數據確實為zhangsh123@xxx.com,將結果加入結果集;

3、 繼續(xù)查找index2索引樹下一個索引值是否滿足zhangs,滿足則繼續(xù)回表查詢該行數據是否為zhangsh123@xxx.com,不是則跳過繼續(xù)查找;

4、持續(xù)查找index2索引樹,直到索引值不是zhangs為止。

從以上分析中我們可以看出,全字段索引相比前綴索引來說,減少了回表的次數,但是如果我們將前綴從6個增加到7個8個的話,前綴索引回表的次數就會減少,也就是說,只要定義好前綴的長度,我們就能既節(jié)省空間又保證效率。

那么問題來了,我們怎么衡量使用前綴索引的長度呢?

1、使用 select count(distinct email) as L from t; 查詢字段不同值的個數;

2、依次選取不同的前綴長度查看不同值的個數:

select
 count(distinct left(email,4))as L4,
 count(distinct left(email,5))as L5,
 count(distinct left(email,6))as L6,
 count(distinct left(email,7))as L7,
from t;

然后根據實際可接受的損失比例,選取適合的最短的前綴長度。

前綴的長度問題我們解決了,但是一個問題是,如果使用前綴索引,那我們索引覆蓋的特性就用不到了。
用全字段索引時,當我們查詢select id,email from t where email='zhangsh123@xxx.com';時,不用回表直接就能查到id和email字段。

但是用前綴索引時,MySQL并不清楚前綴是否會整個覆蓋email的值,無論是否全包含都會根據主鍵值回表查詢判斷。

所以說,使用前綴索引雖然能節(jié)省空間保證效率但是卻不能用到覆蓋索引的特性,是否使用就在于具體考慮了。

其他字符串索引創(chuàng)建方式

實際情況實際考慮,并不是所有的字符串都能使用前綴截取的方式創(chuàng)建索引,如身份證號或者ip這些字符串使用前綴索引就不合理了,身份證號一般同一個地區(qū)的人前幾位都是一模一樣的,使用前綴索引就不合理了,而ip值我們一般在實際中將其轉化為數字去存儲。

針對身份證號,我們可以使用倒敘存儲,取前綴創(chuàng)建索引或者使用crc32()函數來獲取一個hash校驗碼(int值)當做索引。

倒敘:select field_list from t where id_card = reverse('input_id_card_string');

crc32:select field_list from t where id_card_crc=crc32('input_id_card_string') and id_card='input_id_card_string'

這兩種方式相對來說效率都差不多,都不支持范圍查找,支持等值查找。

在倒敘方式中,需要使用reverse函數,但是回表次數可能比hash方式多。

在hash方式中,需要新建一個索引字段并調用crc32()函數。(注意:crc32()函數獲取的結果不保證能唯一,可能存在重復的情況,但是這種情況概率較?。?,回表次數少,幾乎1次就行。

最后

針對字符串索引,一般有以下幾種創(chuàng)建方式:

1、字符串較短,直接全字段索引

2、字符串較長,且前綴區(qū)分度較好,創(chuàng)建前綴索引

3、字符串較長,前綴區(qū)分度不好,倒敘或hash方式創(chuàng)建索引(這種方式范圍查詢就不行了)

4、根據實際情況,遇到特殊字符串,特殊對待,如ip。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

相關文章

  • 深入理解MySQL事務特性與自動提交

    深入理解MySQL事務特性與自動提交

    事務以及事務隔離機制,其實是所有關系型數據庫都有的問題,本文主要介紹了深入理解MySQL事務特性與自動提交,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • 深入解析MySQL?事務

    深入解析MySQL?事務

    這篇文章主要給大家分享的是mysql事務解析,事務(transaction)是業(yè)務邏輯的一個基本的單元組成,下面文章圍繞mysql事務的相關資料展開詳細內容,需要的朋友可以參考一下希望對大家有所幫助
    2022-01-01
  • 快速修復損壞的MySQL數據庫

    快速修復損壞的MySQL數據庫

    在長時間使用 MySQL 后,數據庫可能會出現一些問題。大多數問題可以通過簡單的操作進行快速修復。下面介紹兩種快速檢修 MySQL 數據庫的方法。
    2011-06-06
  • MySQL如何使用時間作為判斷條件

    MySQL如何使用時間作為判斷條件

    這篇文章主要介紹了MySQL如何使用時間作為判斷條件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • clickhouse復雜時間格式的轉換方式

    clickhouse復雜時間格式的轉換方式

    這篇文章主要介紹了clickhouse復雜時間格式的轉換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • MySQL中如何優(yōu)化order by語句

    MySQL中如何優(yōu)化order by語句

    本文主要介紹了MySQL中如何優(yōu)化order by語句,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • MySQL 5.7安裝好后打開命令行窗口閃退的解決方法

    MySQL 5.7安裝好后打開命令行窗口閃退的解決方法

    這篇文章主要給大家介紹了關于MySQL 5.7安裝好后打開命令行窗口閃退的解決方法,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起看看吧
    2018-12-12
  • MySQL 整體架構介紹

    MySQL 整體架構介紹

    這篇文章主要介紹了MySQL 整體架構的相關資料,幫助大家更好的了解和使用MySQL數據庫,感興趣的朋友可以了解下
    2020-10-10
  • MySQL大量臟數據如何只保留最新的一條(最新推薦)

    MySQL大量臟數據如何只保留最新的一條(最新推薦)

    這篇文章主要介紹了MySQL大量臟數據,如何只保留最新的一條,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • 用于App服務端的MySQL連接池(支持高并發(fā))

    用于App服務端的MySQL連接池(支持高并發(fā))

    這篇文章主要介紹了用于App服務端的MySQL連接池,并支持高并發(fā),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-12-12

最新評論

松原市| 陆良县| 塔城市| 彭州市| 吉木萨尔县| 任丘市| 江西省| 临邑县| 莲花县| 寿阳县| 兴安盟| 抚宁县| 资阳市| 廉江市| 莱阳市| 明光市| 湾仔区| 齐河县| 探索| 屏山县| 遂平县| 伊春市| 九台市| 连江县| 左权县| 新兴县| 隆林| 潼南县| 广灵县| 淮阳县| 梅河口市| 溧阳市| 准格尔旗| 阿鲁科尔沁旗| 阜城县| 商都县| 夏津县| 崇州市| 南宫市| 蛟河市| 德庆县|