如何理解Mysql的索引及他們的原理?
野路子出身的我對mysql的索引似懂非懂(不僅僅是mysql啦,關係型資料庫的索引都不是很懂,這種東西太抽象了),做起項目來不是那麼的得心用手,希望大牛們能為我答疑一下。
1、索引到底是個什麼東西?2、他到底是怎麼運作的?如果有實例的話就更好了。
索引類似於字典的前面的查字表,把某個欄位的數據從頭到尾排序放在一起,並寫明對應的數據記錄的位置。這樣搜索的時候只要翻這個就可以了,不需要從頭到尾遍曆數據
索引,我的理解就是一種根據某個欄位整理好的數據緩存,這個緩存被存在資料庫一個特殊的區域,有的時候甚至是在內存里,通過索引,大大增加了查詢的速度,但是也會佔用更多計算機的資源。舉個例子,在運營商海量數據的資料庫用戶表中中,包含有用戶id以及用戶身份證號碼兩個欄位,並且這兩者都是唯一併且一一對應的,那麼如果你對id建立了索引,你通過這個索引的速度找到對應的客戶,是絕對比通過身份證號碼去找到對應的客戶要快不只一個數量級的。當然,索引也不是建的越多越好。哪些欄位設置為索引欄位要考慮到表的規模,搜索的複雜度,以及需求等因素。
索引好比字典的目錄,讓你按照一定的規則更快的找到目標數據
1. 什麼是索引:我們拿出一本新華字典,它的目錄實際上就是一種索引:非聚集索引。我們可以通過目錄迅速定位我們要查的字。而字典的內容部分一般都是按照拼音排序的,這實際上又是一種索引:聚集索引。
2:用不用索引
索引至少會帶來如下的overhead額外的創建時間額外的存儲空間(單列索引占原表5%至15%空間,想像一下如果為一個表創建三四個索引)額外的維護時間
這一切只為了一個目的:減少在small range query的情況下的query time。如果是大range query 返回1%以上的數據,這情況下索引的意義不大。
3. 用什麼索引:
low selectivity情況下 比如parent column為性別,bitmap index什麼的可以考慮
high selectivity可以用btree什麼的來維持二分查找的查找效率如果某個欄位,或一組欄位會出現在一個會被頻繁調用的where子句中,那麼它們應該是被索引的,這樣會更快的得到結果。同時,唯一索引的用途前面提到了,恰當的使用它們,避免意外的發生。我個人不推薦使用全文索引,尤其對於漢字來說,全文索引的開銷太大了,我寧可選擇搜索引擎提供的站內搜索功能。雖然搜索引擎的收錄不是很及時,但是我覺得也不是不能接受。
再說一次,我覺得應該盡量在插入/修改/刪除數據的時候多做一些事情,相對來說,這些操作不那麼頻繁,而且單次操作的數據量也更小。不要將壓力都留給查詢語句。
全文索引:在全文中索引?與之對應的是什麼索引?
索引的好處和壞處
創建索引的好處:
1、 加快經常被搜索欄位的搜索速度。
2、利用索引的唯一性來控制記錄的唯一性
3、 等
創建索引的壞處:
1、額外的存儲空間(單列索引占原表5%至15%空間,想像一下如果為一個表創建三四個索引)
2、額外的創建和維護時間:執行數據修改操作(INSERT、UPDATE、DELETE)產生索引維護
索引的分類
聚集索引
非聚集索引
哈希索引
B+-樹索引(二分查找)
比如你在看書的時候想找到特定的主題,一般先看書的索引,找到對應的頁碼。在mysql中存儲引擎用類似的方法建立索引,先在索引中找到對應的值,然後根據匹配的索引紀錄找到對應的行。比如你執行sql語句:select first_name from actors where actor_id =5,則mysql根據索引找到actor_id等於5的行,然後返回包含該值的數據行。
就是樹,加上各種優化微調。
非常有用
推薦閱讀:
※MySQL學習筆記(二)索引與視圖
※用戶和管理員同時操作同一記錄的不同欄位,如果做並發控制?
※MySQL 對於千萬級的大表要怎麼優化?
※【原創】MYSQL 的那些「坑」
※mysql,zk這些強一致性的軟體為什麼要先寫日誌?