欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL 隔離數據列和前綴索引的使用總結

 更新時間:2021年05月14日 09:47:40   作者:島上碼農  
正確地創(chuàng)建和使用索引對于查詢性能十分重要。由于存在很多種特殊場景的優(yōu)化和行為,因此有很多種方式去有效選擇和使用索引。因此,決定如何使用索引這一項技能是需要經驗和時間的積累去培養(yǎng)的。以下會介紹一些如何有效使用索引的方法。

隔離數據列

通常,我們會發(fā)現查詢語句會妨礙MySQL使用索引。除非在查詢語句中列是獨立的,否則MySQL不會使用這些列的索引。“隔離”的意思是索引列不應該成為表達式的一部分或者在一個查詢函數體中。例如下面的例子就不會命中actor_id這個索引。

SELECT `actor_id` FROM `actor` WHERE `actor_id` + 1 = 2;

對于人來說,很容易知道查詢條件實際是actor_id = 4,但是MySQL不會這么處理,因此養(yǎng)成簡化WHERE判決條件的習慣,這意味著索引列獨立地在比較操作符的一側。下面是另外一個普遍錯誤的案例:

SELECT ... WHERE TO_DAYS(CURRENT_DATE) - TO_DAYS(date_col) <= 10;

前綴索引和索引的選擇性

有時候需要在很長字符的列上建立索引,但這樣會導致索引占據的空間很大且查詢變慢。一個策略是使用哈希索引模擬,但有時候這未必是足夠好,這個時候該怎么做?

通常是可以將索引列前面的部分字符建立索引來替換全字段索引提高性能和節(jié)省空間。但這種方式會使得選擇性變差。索引的選擇性是指獨立的索引值篩選出的數據占整個數據集合的比例。高選擇性的索引可以讓MySQL過濾掉更多無關的數據。例如,一個唯一索引的選擇性是1。 列的前綴通常在選擇性方面已經能夠提供足夠好的性能。如果使用BLOB或TEXT或非常長的VARCHAR字段列,你必須定義前綴索引,以為MySQL不允許做全長度索引。

你需要在使用更長的前綴以獲得更好的選擇性和足夠短的前綴以節(jié)省存儲空間之間平衡。為了確定一個合適的前綴長度,查找出最高頻的值,然后和最頻繁的前綴進行比較。例如以城市數據表為例,我們可以使用如下的語句統(tǒng)計:

SELECT COUNT(*) as cnt, `name` FROM `common_city` GROUP BY `name` ORDER BY cnt DESC LIMIT 10

可以看到這些城市名稱出現的次數比較多。現在我們可以使用1個字的前綴查找最為頻繁的城市名稱前綴。

SELECT COUNT(*) as cnt, LEFT(`name`, 1) as pref FROM `common_city` GROUP BY pref ORDER BY cnt DESC LIMIT 10

可以看到1個字找出來的數據集更多了,這會導致獨立選中的機會越少,因此需要調整一下前綴的長度。例如調到3個字。

SELECT COUNT(*) as cnt, LEFT(`name`, 3) as pref FROM `common_city` GROUP BY pref ORDER BY cnt DESC LIMIT 10

可以看到這和全長度的相差不多,那實際三個字的前綴就夠了(原文使用的是英文城市數據表,字符會更多)。另外一種方式是使用不同長度的前綴數量與全字段數量的比例評估多少合適。例如:

SELECT 
  COUNT(DISTINCT LEFT(`name`, 1)) / COUNT(`name`) as pref1, 
  COUNT(DISTINCT LEFT(`name`, 2)) / COUNT(`name`) as pref2, 
  COUNT(DISTINCT LEFT(`name`, 3)) / COUNT(`name`) as pref3, 
  COUNT(DISTINCT LEFT(`name`, 4)) / COUNT(`name`) as pref4 
FROM `common_city`

數值越接近于1效果越好,但是也可以看到,隨著前綴長度的加長改善的空間越小。只看平均值并不是一個好主意,還需要檢查一下最壞情況。也許會覺得3-4個字足夠了,但是如果數據分布很不均勻,那可能會存在陷阱。因此還需要檢查一下前綴少的是不是存在一個前綴對應的數據與其他相比極其多的情況。最后可以給指定的列加前綴索引。

ALTER TABLE `common_city` ADD KEY (name(3));

前綴索引在節(jié)省空間和提高效率方面表現不錯,但是也有缺陷,那就是在ORDER BY和GROUP BY上無法使用索引(實際驗證在MySQL 5.7以上版本也有用)。另外一種常見的場景是在較長的十六進制字符串中,例如存儲的sessionId,取前8位前綴做索引將過濾很多無關數據,效果很好。

以上就是MySQL 隔離數據列和前綴索引的使用總結的詳細內容,更多關于MySQL 隔離數據列和前綴索引的資料請關注腳本之家其它相關文章!

相關文章

  • MySQL中json_extract函數說明及使用方式

    MySQL中json_extract函數說明及使用方式

    今天看mysql中的json數據類型,涉及到一些使用,使用到了函數json_extract來,下面這篇文章主要給大家介紹了關于MySQL中json_extract函數說明及使用方式的相關資料,需要的朋友可以參考下
    2022-08-08
  • 關于MySQL數據遷移--data目錄直接替換注意事項的詳解

    關于MySQL數據遷移--data目錄直接替換注意事項的詳解

    本篇文章是對關于MySQL數據遷移--data目錄直接替換的注意事項進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • Ubuntu Server下MySql數據庫備份腳本代碼

    Ubuntu Server下MySql數據庫備份腳本代碼

    為了mysql數據庫的安全,我們需要定時備份mysql數據庫,這里提供下腳本代碼,需要的朋友可以參考下
    2013-06-06
  • MySQL HandlerSocket插件安裝配置教程

    MySQL HandlerSocket插件安裝配置教程

    這篇文章主要介紹了MySQL HandlerSocket插件安裝配置,包括PHP HandlerSocket插件的安裝配置,需要的朋友可以參考下
    2014-04-04
  • Mysql中幻讀的概念以及如何解決

    Mysql中幻讀的概念以及如何解決

    這篇文章主要介紹了Mysql中幻讀的概念以及如何解決,幻讀指的是一個事務在前后兩次查詢同一個范圍的時候,后一次查詢看到了前一次查詢沒有看到的行,需要的朋友可以參考下
    2023-05-05
  • Mysql之如何根據.frm和.idb文件恢復表結構

    Mysql之如何根據.frm和.idb文件恢復表結構

    這篇文章主要介紹了Mysql之如何根據.frm和.idb文件恢復表結構問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • mysql如何查詢重復數據并刪除

    mysql如何查詢重復數據并刪除

    這篇文章主要介紹了mysql如何查詢重復數據并刪除問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • MYSQL命令行導入導出數據庫詳解

    MYSQL命令行導入導出數據庫詳解

    這篇文章主要詳細介紹了MYSQL命令行進行導入導出數據庫操作的方法,并且分win系統(tǒng)和Linux系統(tǒng)介紹了mysql備份和還原的方法,非常的詳細,希望對大家能有所幫助
    2014-09-09
  • 一文解析MySQL的MVCC實現原理

    一文解析MySQL的MVCC實現原理

    這篇文章主要介紹了MySQL的MVCC實現原理,MVCC全稱是Multi-Version?Concurrency?Control是一種并發(fā)控制的方法,通過維護一個數據的多個版本,減少讀寫操作的沖突
    2022-08-08
  • MySQL解決字符集編碼問題

    MySQL解決字符集編碼問題

    MySQL的默認編碼方式是?拉丁文,如果想要設置一些漢字的數據.可能會報錯.這篇文章中主要介紹了解決這個問題的方法,需要的朋友可以參考一下
    2023-04-04

最新評論