《MySQL——給長字符串加索引》

對于長字符串,可用如下方式建立索引:
(1)前綴索引
(2)字符串倒敘+前綴索引
(3)添加hash字段+并在hash字段上加索引
(4)字段拆分(一個字段可拆分為兩個以上)

假設現在表User 中存在email字段,為長字符串。如果email字段上沒有索引,那么這個語句只能做全表掃描

select f1,f2 from User where email = '1540984562@qq.com';

在email字段上創建索引
–創建的index1索引包含整個字符串

alter table User add index index1(email);

–創建的index2索引只包含字符串前6個字節

alter table User add index index2(email(6));

前綴索引占用的空間更小,但是會增加掃描的次數。
使用前綴索引,定義好長度,就可以做到既節省空間,又不額外增加太多查詢成本。
在建立索引時關注區分度,可區分度越高,意味著重復的鍵值越少

可以依次選取不同長度的前綴來看這個值,比如看4~7個字節的前綴索引:

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 User;

前綴索引對覆蓋索引的影響

如果我們的語句是:
select id,email from User where email = ‘1540984562@qq.com’;
這個語句只要求返回id和email字段。
如果使用的整個字符串作為索引,會觸發覆蓋索引,不需要回表ID索引再查詢。
而如果使用的是前綴索引,就還得回表ID索引去獲取email字段的完整值

所以如果使用了前綴索引就相當于放棄掉了覆蓋索引對查詢性能的優化了。

使用 倒序 與 hash 構造新字段

1、倒序
如果我們對身份證號碼進行前綴索引提取,會發現,前面的號碼重復率極高。
此時可以使用倒序存儲
select field_list from t where id_card = reverse(‘input_id_card_string’);
由于身份證最后幾位的重復邏輯較小,所以最后6位很可能提供了足夠的區分度
2、hash字段
在表上再創建一個整數字段,來保存身份證的校驗碼,同時在這個字段上創建索引。

alter table t add id_card_crc int unsigned,add index(id_card_crc);

然后每次插入新紀錄的時候,都同時用crc32()這個函數得到校驗碼填到這個新字段。
由于校驗碼可能存在沖突,也就是說兩個不同的身份證號通過crc32()函數得到的結果可能相同,
所以查詢語句還要判斷id_card是否精確相同。

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

兩者異同點:
相同
都不支持范圍查詢,只支持等值查詢
不同
1、占用額外空間不同:
倒序存儲不會消耗額外的存儲空間。hash需要增加一個字段。
若倒序存儲使用4個字節作為前綴不夠,也會消耗額外字段
2、CPU消耗方面:
倒序每次都要調用reverse函數
hash需要調用crc32函數。reverse的時間復雜度會更小
3、查詢效率:
hash字段查詢性能相對更穩定,發生沖突概率很小,可以認為每次查詢平均掃描行數為1.
倒序存儲方式仍然使用的是前綴索引方式,還會增加掃描行數

總結:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377237.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377237.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377237.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[藍橋杯歷屆試題] 歐拉與雞蛋

大數學家歐拉在集市上遇到了本村的兩個農婦,每人跨著個空籃子。她們和歐拉打招呼說兩人剛剛賣完了所有的雞蛋。 歐拉隨便問:“賣了多少雞蛋呢?” 不料一個說:“我們兩人自己賣自己的,一共賣了150個雞蛋,雖然…

Python元組練習

Here, we are covering following Python tuple exercises, 在這里,我們將介紹以下Python元組練習 , Creating & printing a tuple 創建和打印元組 Unpacking the tuple into strings 將元組解包成字符串 Create a tuple containing the letters of…

傻瓜教你看清MVC內部執行流程之ViewData數據傳輸,輕松學MVC--①目了然篇(待續)

1.首先在執行到Controller里面的action(方法)時,執行到最后會調用一個View()-->此方法是Controller的一個方法 源代碼: View Code protected internal ViewResult View(){return View(null /* viewName */, null /* masterName */, null /* model */);} 2.然后繼續調用自己…

《MySQL——count()邏輯》

count()用法 count()語義:該函數為一個聚合函數,對于返回的結果集一行行地判斷,如果count函數地參數不是NULL,累計值就加1,否則不加。最后返回累計值。 所以count(*),count(主鍵id)和count(1)都表示返回滿足條件地結果…

phpmailer 發送郵件

<?php /* 可用新浪和網易郵箱測試成功&#xff0c;但QQ不成功&#xff01; 下載 phpmailer 解壓 http://phpmailer.worxware.com/要注意郵件服務器的端口號&#xff0c;默認是 25 不用修改&#xff0c;如果不是則要修改如下&#xff0c;在$mail->IsSMTP() ;下一行加上 $…

靜態負載均衡和動態負載均衡_動態負載平衡

靜態負載均衡和動態負載均衡動態負載平衡 (Dynamic Load Balancing) The algorithm monitors changes on the system workload and redistributes the work accordingly. 該算法監視系統工作負載的變化并相應地重新分配工作。 This algorithm works on three strategies: 該算…

poj 1088

題目&#xff1a;http://poj.org/problem?id1088 記憶化搜索&#xff0c;dp[r][c] max(dp[r - 1][c] , dp[r 1][c] , dp[r][c - 1] , dp[r][c 1]) 1 ( if (題目給的條件滿足&#xff09;&#xff09; View Code 1 using namespace std;2 typedef long long ll;3 const in…

《MySQL——order by邏輯(全字段排序與rowid排序)》

創建一個表&#xff0c;然后使用查詢語句&#xff1a; 查詢城市是“杭州”的所有人名字&#xff0c;并且按照姓名排序返回前 1000 個人的姓名、年齡 create table t (id int(11) not null,city vachar(16) not null,name vachar(16) not null,age vachar(16) not null,addr va…

ruby 生成哈希值_哈希== Ruby中的運算符

ruby 生成哈希值In the last article, we have seen how we can compare two hash objects with the help of < operator? "<" method is a public instance method defined in Rubys library. 在上一篇文章中&#xff0c;我們看到了如何在<運算符的幫助下…

HTML5 video

摘要&#xff1a;本文主要介紹HTML5 video在android2.2中實現的主要架構和程序流程。 一、實現HTML5 video主要的類 1&#xff0e; 主要類結構及介紹 圖1中綠色類為java類&#xff0c;其余為c類&#xff0c;下面是各個類的具體介紹: (1) HTMLElement類不是最上層類&#xff0c…

《MySQL——使用聯合索引、覆蓋索引,避免臨時表的排序操作》

聯合索引避免臨時表排序 在上一篇筆記(MySQL——order by邏輯&#xff08;全字段排序與rowid排序&#xff09;)中&#xff0c;講到查詢語句查詢多個字段的時候使用order by語句實現返回值是有序的&#xff0c;而order by是使用到了臨時表的&#xff0c;會帶來時間和空間損失。…

明源面試

明源面試&#xff0c;筆試題目如下 一、SQL測試題 1 有兩張表 根據給出的SQL語句&#xff0c;寫出返回的行數分別是多少&#xff1f;為了形象直觀的顯示&#xff0c;我給出了sql語句執行結果。 A 學生表 B分數表 新題目 select a.* from a inner join b on a.idb.id; …

AEAP的完整形式是什么?

AEAP&#xff1a;盡早 (AEAP: As Early As Possible) AEAP is an abbreviation of "As Early As Possible". AEAP是“ April越早”的縮寫 。 It is an expression, which is commonly used in messaging or chatting on social media networking sites like Faceboo…

jquery 視覺特效(鼠標懸停時依次顯示圖片)

效果描述&#xff1a; 有幾副圖片&#xff0c;讓他們依次疊加重合。首先顯示第一張圖片。然后鼠標懸停在上面&#xff0c;邊框變化。然后離開&#xff0c;然后第一張淡出&#xff0c;第二張淡入。接著懸停在第二張圖片&#xff0c;邊框變化&#xff0c;然后離開&#xff0c;第二…

《MySQL tips:查詢時,盡量不要對字段進行操作》

維護一個交易系統&#xff0c;交易記錄表tradelog包含交易流水號(tradeid)、交易員id(operator)、交易時間(t_modified)等字段。 建表語句如下&#xff1a; create table tradelog (id int(11) not null,tradeid varchar(32) default null,operator int(11) default null,t_mo…

cocos2dx blender 骨骼動畫實現

前言 cocos2d-x 中相關部分代碼介紹 背景知識介紹 參考 http://www.3dkingdoms.com/weekly/weekly.php?a4 一 簡單3d 模型支持 第一步實現對3d 模型的簡單支持&#xff0c;完成一個CCSprite3D 類 參考CCSprite 類 以及 CCGLProgram 代碼 主要修改 draw 方法。 添加了定點數組…

關于web.config中customErrors節點說明

關于web.config中<customErrors>節點說明 <customErrors>節點用于定義一些自定義錯誤信息的信息。此節點有Mode和defaultRedirect兩個屬性&#xff0c;其中defaultRedirect屬性是一個可選屬性&#xff0c;表示應用程序發生錯誤時重定向到的默認URL&#xff0c;如果…

肯德基收銀系統模式_肯德基的完整形式是什么?

肯德基收銀系統模式肯德基&#xff1a;肯塔基炸雞 (KFC: Kentucky Fried Chicken) KFC is an abbreviation of "Kentucky Fried Chicken". It is a fast-food restaurant chain whose specialty is known for fried chicken because of its specialization in it. It…

泛型(CSDN轉載)

函數的參數不同叫多態&#xff0c;函數的參數類型可以不確定嗎&#xff1f; 函數的返回值只能是一個嗎&#xff1f;函數的返回值可以不確定嗎&#xff1f; 泛型是一種特殊的類型&#xff0c;它把指定類型的工作推遲到客戶端代碼聲明并實例化類或方法的時候進行。 下面是兩個經典…

《MySQL tips:隱式類型轉換與隱式字符編碼轉換對查詢效率的影響》

維護一個交易系統&#xff0c;交易記錄表tradelog包含交易流水號(tradeid)、交易員id(operator)、交易時間(t_modified)等字段。 create table tradelog (id int(11) not null,tradeid varchar(32) default null,operator int(11) default null,t_modified datetime default n…