婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > MySQL 普通索引和唯一索引的區別詳解

MySQL 普通索引和唯一索引的區別詳解

熱門標簽:啥是企業400電話辦理 怎樣在地圖標注銷售區域 百應電話機器人優勢 地圖標注費用是多少 南昌三維地圖標注 武漢網絡外呼系統服務商 曲靖移動外呼系統公司 外呼系統打電話上限是多少 電話外呼系統改號

1 概念區分

  • 普通索引和唯一索引

普通索引可重復,唯一索引和主鍵一樣不能重復。 唯一索引可作為數據的一個合法驗證手段,例如學生表的身份證號碼字段,我們人為規定該字段不得重復,那么就使用唯一索引。(一般設置學號字段為主鍵)

  • 主鍵和唯一索引

主鍵保證數據庫里面的每一行都是唯一的,比如身份證,學號等,在表中要求唯一,不重復。唯一索引的作用跟主鍵的作用一樣。 不同的是,在一張表里面只能有一個主鍵,主鍵不能為空,唯一索引可以有多個,唯一索引可以有一條記錄為空,即保證跟別人不一樣就行。 比如學生表,在學校里面一般用學號做主鍵,身份證則弄成唯一索引;而到了教育局,他們就把身份證號弄成主鍵,學號換成了唯一索引。 選誰做表的主鍵,要看實際應用,主鍵不能為空。

2 案例引入

某居民系統,每人有唯一身份證號。如果系統需要按身份證號查姓名,就會執行類似如下SQL:

select name from CUser where id_card = 'ooxx';

然后你肯定會在id_card字段建索引。但id_card字段較大,不推薦將其做主鍵。于是現有倆選擇:

  1. 給id_card字段創建唯一索引
  2. 創建一個普通索引

假定業務代碼已保證不會寫入重復的身份證號,這兩個選擇邏輯上都正確。但從性能角度考慮,唯一索引還是普通索引呢?

再看如下案例:假設字段 k 上的值都不重復。

  • InnoDB的索引組織結構:

接下來分析性能。

3 查詢性能

select id from T where k=4

通過B+樹從樹根開始層序遍歷到葉節點,可認為數據頁內部是通過二分法搜索。

  • 普通索引,查找到滿足條件的第一個記錄(4,400)后,需查找下個記錄,直到碰到第一個不滿足k=4的記錄
  • 唯一索引,由于索引具備唯一性,查找到第一個滿足條件的記錄后,就會停止檢索

看起來性能差距很微小。

InnoDB數據按數據頁單位讀寫。即讀一條記錄時,并非將該一個記錄從磁盤讀出,而以頁為單位,將其整體讀入內存。

因此普通索引,要多做一次“查找和判斷下一條記錄”的操作,也就一次指針尋找和一次計算。 如果k=4記錄恰為該數據頁最后一個記錄,那么要取下個記錄,還得讀取下個數據頁,操作稍微復雜。 對整型字段,一個數據頁可存近千key,因此這種情況概率其實也很低。因此計算平均性能差異時,可認為該操作成本對現在CPU開銷忽略不計。

我們知道 MySQL 有 change buffer。

4 更新性能

現在來看往表中插入一個新記錄(4,400),InnoDB會做什么?

需要區分該記錄要更新的目標頁是否在內存:

4.1 在內存

  • 唯一索引

找到3和5之間位置,判斷到沒有沖突,插入值,語句執行結束。

  • 普通索引

找到3和5之間位置,插入值,語句執行結束。

普通索引和唯一索引對更新語句性能影響的差別,只是一個判斷,耗費微小CPU時間。

4.2 不在內存

  • 唯一索引

需將數據頁讀入內存,判斷到沒有沖突,插入值,語句執行結束。

  • 普通索引

將更新記錄在change buffer,語句執行結束。

將數據從磁盤讀入內存涉及隨機IO訪問,是數據庫里面成本最高操作之一。而change buffer減少隨機磁盤訪問,所以更新性能提升明顯。

5 實踐中的索引選擇

普通索引和唯一索引究竟如何抉擇?這兩類索引在查詢性能上沒差別,主要考慮對更新性能影響。所以,推薦盡量選擇普通索引。

如果所有更新后面,都緊跟對該記錄的查詢,那么該關閉change buffer。 而在其他情況下,change buffer都能提升更新性能。 普通索引和change buffer的配合使用,對于數據量大的表的更新優化還是很明顯的。

在使用機械硬盤時,change buffer機制的收效非常顯著。 所以,當你有一個類似“歷史數據”的庫,并且出于成本考慮用機械硬盤時,應該關注這些表里的索引,盡量使用普通索引,把change buffer 開大,確?!皻v史數據”表的數據寫速度。

6 change buffer 和 redo log

WAL 提升性能的核心機制,也是盡量減少隨機讀寫,這兩個概念易混淆。 所以,這里我把它們放到了同一個流程里來說明區分。

6.1 插入流程

insert into t(id,k) values(id1,k1),(id2,k2);

假設當前k索引樹的狀態,查找到位置后,k1所在數據頁在內存(InnoDB buffer pool),k2數據頁不在內存。

  • 帶change buffer的更新流程圖,圖中兩個箭頭都是后臺操作,不影響更新響應。

該更新做了如下操作:

  1. Page1在內存,直接更新內存
  2. Page2不在內存,就在change buffer區,緩存下“往Page2插一行記錄”的信息
  3. 將前兩個動作記入redo log

之后事務完成。執行該更新語句成本很低,只寫兩處內存,然后寫一處磁盤(前兩次操作合在一起寫了一次磁盤),還是順序寫。

6.2 怎么處理之后的讀請求?

select * from t where k in (k1, k2);

讀語句緊隨更新語句,內存中的數據都還在,此時這倆讀操作就與系統表空間和 redo log 無關。所以在圖中就沒畫這倆。

  • 帶change buffer的讀過程

讀Page1時,直接從內存返回。 WAL之后如果讀數據,是不是一定要讀盤,是不是一定要從redo log里面把數據更新以后才可以返回?其實不用。 看上圖狀態,雖然磁盤上還是之前數據,但這里直接從內存返回結果,結果正確。

要讀Page2時,需把Page2從磁盤讀入內存,然后應用change buffer里面的操作日志,生成一個正確版本并返回結果。 可見直到需讀Page2時,該數據頁才被讀入內存。

所以,要簡單對比這倆機制對更新性能影響

  • redo log 主要節省隨機寫磁盤的IO消耗(轉成順序寫)
  • change buffer主要節省隨機讀磁盤的IO消耗

7 總結

由于唯一索引用不了change buffer的優化機制,因此如果業務可以接受,從性能角度,推薦優先考慮非唯一索引。

7.1 關于到底是否使用唯一索引

主要糾結在“業務可能無法確?!?。本文前提是“業務代碼已經保證不會寫入重復數據”下,討論性能問題。

如果業務不能保證,或者業務就是要求數據庫來做約束,那么沒得選,必須創建唯一索引。這種情況下,本文意義在于,如果碰上大量插入數據慢、內存命中率低時,多提供一個排查思路。
然后,在一些“歸檔庫”的場景,可考慮使用唯一索引的。比如,線上數據只需保留半年,然后歷史數據保存在歸檔庫。此時,歸檔數據已是確保沒有唯一鍵沖突。要提高歸檔效率,可考慮把表的唯一索引改普通索引。

7.2 如果某次寫入使用change buffer,之后主機異常重啟,是否會丟失change buffer的數據?

不會丟失。 雖然是只更新內存,但在事務提交時,我們把change buffer的操作也記錄到redo log,所以崩潰恢復時,change buffer也能找回。

7.3 merge的過程是否會把數據直接寫回磁盤?

merge執行流程

  1. 從磁盤讀入數據頁到內存(老版本數據頁)
  2. 從change buffer找出該數據頁的change buffer 記錄(可能有多個),依次應用,得到新版數據頁
  3. 寫redo log

該redo log包含數據的變更和change buffer的變更

至此merge過程結束。 這時,數據頁和內存中change buffer對應磁盤位置都尚未修改,是臟頁,之后各自刷回自己物理數據,就是另外一過程。

問題思考

在構造第一個例子的過程,通過session A的配合,讓session B刪除數據后又重新插入一遍數據,然后就發現explain結果中,rows字段從10001變成37000多。 而如果沒有session A的配合,只是單獨執行delete from t 、call idata()、explain這三句話,會看到rows字段其實還是10000左右。這是什么原因呢?

如果沒有復現,檢查

  • 隔離級別是不是RR(Repeatable Read,可重復讀)
  • 創建的表t是不是InnoDB引擎

為什么經過這個操作序列,explain的結果就不對了? delete 語句刪掉了所有的數據,然后再通過call idata()插入了10萬行數據,看上去是覆蓋了原來10萬行。 但是,session A開啟了事務并沒有提交,所以之前插入的10萬行數據是不能刪除的。這樣,之前的數據每行數據都有兩個版本,舊版本是delete之前數據,新版本是標記deleted的數據。 這樣,索引a上的數據其實有兩份。

然后你會說,不對啊,主鍵上的數據也不能刪,那沒有使用force index的語句,使用explain命令看到的掃描行數為什么還是100000左右?(潛臺詞,如果這個也翻倍,也許優化器還會認為選字段a作為索引更合適) 是的,不過這個是主鍵,主鍵是直接按照表的行數來估計的。而表的行數,優化器直接用的是show table status的值。 大家的機器如果IO能力比較差的話,做這個驗證的時候,可以把innodb_flush_log_at_trx_commit sync_binlog 都設置成0。

以上就是MySQL 普通索引和唯一索引的區別詳解的詳細內容,更多關于MySQL 普通索引和唯一索引的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • MySQL 索引和數據表該如何維護
  • MySQL索引知識的一些小妙招總結
  • MySQL創建高性能索引的全步驟
  • MySQL創建索引需要了解的
  • MySQL查詢冗余索引和未使用過的索引操作
  • 淺談Mysql哪些字段適合建立索引
  • MySQL復合索引的深入探究
  • mysql 添加索引 mysql 如何創建索引
  • MySQL索引類型總結和使用技巧以及注意事項
  • MySQL 創建索引(Create Index)的方法和語法結構及例子
  • mysql性能優化之索引優化
  • MySQL 主鍵與索引的聯系與區別分析
  • MySQL如何構建數據表索引

標簽:資陽 滄州 吉林 甘南 隨州 錦州 荊州 黑河

巨人網絡通訊聲明:本文標題《MySQL 普通索引和唯一索引的區別詳解》,本文關鍵詞  MySQL,普通,索引,和,唯一,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL 普通索引和唯一索引的區別詳解》相關的同類信息!
  • 本頁收集關于MySQL 普通索引和唯一索引的區別詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久精品国产色蜜蜜麻豆| 亚洲国产欧美日韩另类综合 | 欧美一二三区精品| 色婷婷久久久亚洲一区二区三区| 国产在线观看一区二区| 国产毛片精品视频| 一本色道亚洲精品aⅴ| 91免费版在线| 色偷偷久久人人79超碰人人澡| 99re6这里只有精品视频在线观看| 在线观看av一区二区| 日韩一区二区三区av| 国产亚洲一区二区在线观看| 国产精品灌醉下药二区| 午夜久久电影网| www欧美成人18+| 在线免费观看日韩欧美| 国模冰冰炮一区二区| 欧美日韩中文精品| 国产原创一区二区三区| 精品国产一区二区国模嫣然| 2019国产精品| 色av一区二区| 国产一区二区三区免费播放| 国产亚洲欧美激情| 国产精品久久久久久妇女6080| 伊人一区二区三区| 狠狠色丁香久久婷婷综| 在线观看不卡一区| 国产女人aaa级久久久级 | jlzzjlzz欧美大全| 欧美日韩色一区| 久久看人人爽人人| 亚洲成人午夜电影| 成人丝袜高跟foot| 欧美一级电影网站| 亚洲一级二级在线| 国产盗摄一区二区三区| 成人精品在线视频观看| 欧美成人性福生活免费看| 亚洲欧美在线视频| 国产美女精品在线| 欧美一区中文字幕| 一区二区三区欧美视频| 成人一级黄色片| 日韩美女天天操| 性做久久久久久| 在线视频一区二区三| 国产精品美女久久久久久久久久久| 蜜臀va亚洲va欧美va天堂 | 色综合av在线| 国产农村妇女毛片精品久久麻豆| 日韩成人免费看| 欧美色精品在线视频| 久久亚洲综合色一区二区三区| 亚洲黄色免费网站| 一本一本大道香蕉久在线精品 | 成人污污视频在线观看| 亚洲一区二区欧美激情| 69堂成人精品免费视频| 91麻豆精品国产91久久久久久| 精品一区二区三区在线观看 | 中文字幕日韩一区| 丁香激情综合国产| 国产99一区视频免费| 国产一区二区不卡在线| 91精品在线免费| 亚洲高清免费视频| 欧美日韩精品免费观看视频| 久久综合综合久久综合| 国产精品乱人伦| 久国产精品韩国三级视频| 成人激情视频网站| 欧美猛男gaygay网站| 欧美精品日韩综合在线| 精品成人一区二区三区四区| 精品福利一区二区三区| 成人免费视频网站在线观看| 九九九精品视频| 国产精品久久久久aaaa| 色婷婷亚洲综合| 国产成人日日夜夜| 日韩国产精品91| 中文幕一区二区三区久久蜜桃| 91麻豆国产在线观看| 国产成人自拍网| 毛片一区二区三区| 国产91丝袜在线播放0| 欧美aⅴ一区二区三区视频| 中文字幕一区av| 国产日韩欧美精品综合| 欧美成人一级视频| 91一区在线观看| 欧美亚洲日本国产| 日韩av高清在线观看| 欧美手机在线视频| 色婷婷综合在线| 日韩欧美一区二区不卡| 日韩av网站在线观看| 欧美日韩aaaaaa| 国产精品成人免费精品自在线观看| 精品一区二区三区免费视频| 国产精品中文字幕一区二区三区| 9191精品国产综合久久久久久| 亚洲精品国产无天堂网2021 | 国产精品综合在线视频| 麻豆传媒一区二区三区| av网站一区二区三区| 久久先锋资源网| 国产乱码精品1区2区3区| 欧美三级日韩在线| 日韩精品一区二区三区三区免费| 久久久久久久久岛国免费| 欧美一区二区啪啪| 亚洲国产欧美日韩另类综合 | 色成年激情久久综合| 欧美性一二三区| 亚洲日穴在线视频| 国产精品一区二区在线播放| 国产一区二区在线影院| 2020国产精品久久精品美国| 亚洲最新视频在线播放| 久久99热这里只有精品| 精品处破学生在线二十三| 狠狠色狠狠色综合日日91app| 欧美电影免费观看完整版| 天堂成人国产精品一区| 亚洲福利一区二区| 午夜精品久久久久久| 免费精品99久久国产综合精品| 日韩情涩欧美日韩视频| 欧美tickling挠脚心丨vk| 欧美精品粉嫩高潮一区二区| 麻豆视频观看网址久久| 国产又黄又大久久| 成人avav在线| 国产喂奶挤奶一区二区三区| 6080午夜不卡| 欧美在线|欧美| 国产成人免费xxxxxxxx| 国产激情视频一区二区在线观看| 成人av在线一区二区三区| 五月婷婷色综合| 亚洲精品老司机| 一区二区三区欧美久久| 国产精品欧美一级免费| 精品少妇一区二区三区免费观看 | 久久久久国产精品免费免费搜索 | 蜜桃久久av一区| 久草中文综合在线| 一区二区三区国产| 国产精品欧美一级免费| a4yy欧美一区二区三区| 中文字幕一区二区三区四区不卡 | 2020国产成人综合网| 欧美日韩一区小说| 在线日韩一区二区| 91蝌蚪国产九色| 色婷婷精品大在线视频| 欧美中文字幕亚洲一区二区va在线| 91在线视频免费观看| 99re这里都是精品| 91黄色小视频| 欧美日韩在线观看一区二区| 色综合久久久久久久久久久| 在线日韩av片| 在线电影欧美成精品| 日韩欧美电影一区| 国产色产综合产在线视频| 国产日韩一级二级三级| 国产精品黄色在线观看| 一区二区三国产精华液| 亚洲福利视频一区二区| 日本va欧美va欧美va精品| 经典一区二区三区| 成人午夜碰碰视频| 91香蕉视频污在线| 欧美三级韩国三级日本一级| 欧美一级久久久| 日本一区二区电影| 一区二区三区精密机械公司| 麻豆国产91在线播放| 成人黄色小视频在线观看| 色天天综合色天天久久| 欧美一级专区免费大片| 久久久综合精品| 青青草国产成人av片免费| 国内精品国产成人国产三级粉色| 丰满亚洲少妇av| 日韩免费观看高清完整版 | 一区二区三区久久| 亚洲在线中文字幕| 青青青爽久久午夜综合久久午夜| 国产在线乱码一区二区三区| 91热门视频在线观看| 欧美一区三区二区| 欧美激情在线看| 最新国产の精品合集bt伙计| 日本欧洲一区二区| 国产91在线观看|