MySQL操作之索引創建與刪除

2020-12-17 anyux1

大家好,我是anyux。本文介紹MySQL資料庫的索引創建與刪除。

BTree樹的索引分類

聚集索引,聚集索引一般是主鍵列輔助索引,輔助索引輔助聚集索引

聚集索引生成過程

MySQL會自動選擇主鍵作為聚集索引列,沒有主鍵列會選擇唯一鍵,如果都沒有會生成隱藏的主鍵列

MySQL進行存儲時,會按照聚集索引列值的順序,有序存儲數據行聚集索引直接將原表數據頁,作為葉子結點,然後提取聚集索引列向上生成枝和根

輔助索引生成過程

管理員選擇一個列創建輔助索引

MySQL會自動將此列的值取出來將此列的值自動排序將排好序的數據,均勻的存儲到索引的葉子節點生成枝節點和根節點

輔助索引的使用過程

先遍歷輔助索引,找到對應的索引鍵值所對應的id值或者是主鍵值,進而使用主鍵值回到聚集索引,再進行遍歷查詢找到指行數據

聚集索引和輔助索引的區別

表中的任何一個列都可以創建輔助索引,在你有需要的時候,只要名字不同即可在一張表中,聚集索引只能有一個,一般是主鍵輔助索引,葉子結點只存儲索引列的有序值聚集索引,葉子結點存儲的是有序的整行數據MySQL的表數據存儲是聚集索引組織表

輔助索引細分

單列輔助索引

聯合索引(覆蓋索引)[重要]

唯一索引

索引樹高度通常情況下,千萬級別的數據,索引樹高度應該在3~4層,

數據行數較多時候

分表:MySQL自帶的partion功能,使用的比較少了

分片:分布式架構(分庫)

欄位長度

業務允許,儘量選擇長度短的列作為索引列

業務不允許,選擇前綴索引

數據類型

對於變長長度的列來講,使用varchar類型比char類型要有優勢。對於大表而言,使用char數據類型的每個索引長度都是固定值,空格也算在索引的長度裡面,而varchar不是。所以葉子結點的消耗較大,因而要選擇varchar數據類型

索引的命令操作

索引查詢

PRI 主鍵索引

MUL 輔助索引

UNI 唯一索引

use world;

查看索引

desc city;

查看索引詳細信息

show index from city;

創建索引

注意,創建索引也是在線的DDL操作,操作時也會出現鎖表現象。所以創建索引操作應該是業務低谷時間進行操作或者使用PTOSC這樣的工具操作,減少對業務的影響

創建單列的輔助索引

use world;

為city表的name列創建索引

alter table city add index idx_name(name);

查看索引詳情

show index from city;

創建聯合多列的輔助索引

use world;alter table city add index idx_c_p(countrycode,population);

創建唯一索引

注意,首先需要判斷創建索引的列是否存在重複值,存在重複值的列,無法創建唯一索引

use world;select count(district) from city;select count(distinct district) from city;

事實說明存在重複值,district列不應當做唯一索引

alter table city add unique index uidx_dis(district);

創建前綴索引

前綴索引和普通索引沒差,只是不能使用數字作為索引列

use world;alter table city add index idx_dis(district(5));

刪除索引

use world;show index from city;

mysql 批量刪除索引

alter table city drop index idx_name;alter table city drop index idx_c_p;alter table city drop index idx_dis;

相關焦點

  • MYSQL資料庫操作案例
    MySQL 創建資料庫CREATE DATABASE 資料庫名;以下命令簡單的演示了創建資料庫的過程,數據名為 RUNOOB:[root@host]# mysql -u root -p MySQL中刪除數據表是非常容易操作的, 但是你再進行刪除表操作時要非常小心,因為執行刪除命令後所有數據都會消失。
  • MySQL,多列索引
    多列索引我們後續會單獨討論索引列的順序問題。先來看第一個問題,為每個列創建獨立的索引,從SHOW CREATE TABLE中很容易看到這種情況:CREATE TABLE t (c1 INT,c2 INT,C3 INT,KEY(c1),KEY(c2),KEY(c3));這種索引策略,一般是由於人們聽到一些專家諸如「把WHERE
  • 什麼是 MySQL 索引?
    刪除的平均時間複雜度都為O(log(n));註:時間複雜度O是數據結構課程中的基礎內容,不明白同學的自行充電。-      使用組合索引,可以減少文件索引大小,在使用時速度要優於多個單列索引-     索引也不是越多越好,不要過多創建索引,除了增加額外的磁碟空間外,對於DML操作的速度影響很大,因為其每增刪改一次就得從新建立索引說了創建索引,接下來就是使用索引,如果認真研讀過前面的「執行計劃」,SQL用到哪些索引,用了索引沒有一目了然,但是有一些情況就是不會走索引,
  • 24個經典MySQL索引問題,面試學習必看
    這裡值得注意的是,如果主鍵自增長,那麼不能直接執行此操作(自增長依賴於主鍵索引):需要取消自增長再行刪除:altertable user_index -- 重新定義欄位MODIFY id int,dropPRIMARYKEY但通常不會刪除主鍵,因為設計主鍵一定與業務邏輯無關。
  • MySQL怎麼刪除#sql開頭的臨時表
    原因如果MySQL在一個 ALTER TABLE操作(ALGORITHM=INPLACE)的中間退出,那麼可能會留下一個佔用系統空間的臨時表。例如,在對一張表(大表)添加索引時中途中斷、磁碟不足導致異常或正在添加索引時實例被kill等等情況所致。
  • MySQL索引與索引優化
    Innodb:更新(刪除)操作頻率也高,或者要保證數據的完整性;並發量高,支持事務和外鍵。比如OA自動化辦公系統。MySQL索引類型: mysql 有4種不同的索引:主鍵索引(PRIMARY)數據列不允許重複,不允許為NULL,一個表只能有一個主鍵。
  • MySQL的索引
    我們把具有這兩種特性的B+樹稱為聚簇索引,所有完整的用戶記錄都存放在這個聚簇索引的葉子節點處。這種聚簇索引並不需要我們在MySQL語句中顯式的去創建,InnoDB存儲引擎會自動的為我們創建聚簇索引。另外有趣的一點是,在InnoDB存儲引擎中,聚簇索引就是數據的存儲方式(所有的用戶記錄都存儲在了葉子節點),也就是所謂的索引即數據。
  • MySQL 的索引是什麼?怎麼優化?
    2.沒有索引或者索引失效。(一般在網際網路公司,DBA會在半夜把表鎖了,重新建立一遍索引,因為當你刪除某個數據的時候,索引的樹結構就不完整了。這個類型通常出現在 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN() 操作中。
  • 千萬級MySQL資料庫這樣建索引可以讓你的資料庫飛起來
    ;如果複合索引所包含的欄位超過3個,那麼仔細考慮其必要性,考慮減少複合的欄位;如果既有單欄位索引,又有這幾個欄位上的複合索引,一般可以刪除複合索引;8、頻繁進行數據操作的表,不要建立太多的索引;9、刪除無用的索引,避免對執行計劃造成負面影響;
  • 你說你熟悉MySQL索引,給我講講創建索引時應該注意什麼?
    本文來源:http://8rr.co/t6rT首先來看一個問題:在下面這個表 T 中,如果執行 select*fromTwherek between3and5,需要執行幾次樹的搜索操作,會掃描多少行?那麼,SQL 語句是這麼寫的:mysql> select * from tuser where name like '張 %' and age=10 and ismale=1;因為存在 like語句,所以不能使用聯合索引。所以這個語句在搜索索引樹的時候,只能用 「張」,找到第一個滿足條件的記錄 ID3。
  • 面對MySQL 查詢索引失效,程式設計師的六大優化技巧!
    如果緩存命中,mysql不需要執行後面的複雜操作,就可以直接返回結果,效率很高,但是查詢緩存失效非常頻繁,只要有對一個表的更新,這個表的所有查詢緩存都會被清空,因此可能你費力地把結果緩存起來,還沒使用,就被一個更新全部清空了。除非你的業務是一張靜態表,很長時間才會更新一次,這種情況下可以使用查詢緩存。
  • MySQL InnoDB 索引原理
    頁(page)頁是InnoDB存儲引擎的最小管理單位,每頁大小默認是16KB,從InnoDB 1.2.x版本開始,可以利用innodb_page_size來改變頁size,但是改變只能在初始化InnoDB實例前進行修改,之後便無法進行修改,除非mysqldump導出創建新庫
  • 【用binlog日誌】恢復 MySQL 資料庫刪除數據
    1)二進位日誌索引文件(文件名後綴為.index):用於記錄所有的二進位文件;2)二進位日誌文件(文件名後綴為.00000*):記錄資料庫所有的DDL和DML(除了數據查詢語句select)語句事件。binlog日誌對於mysql資料庫來說是十分重要的。
  • Mysql索引:深入理解InnoDb聚集索引與MyisAm非聚集索引值得一看
    (文章最後解答)資料庫兩大神器:索引+鎖,上篇中我們將了mysql的索引原理以及算法(如果不清楚的一定要看看,對理解這篇文章有幫助),這篇我們主要聊聊B+樹數據結構的索引。資料庫中B+樹索引的高度一般都是2~4層,所以我們在檢索一條數據的時候也只需要2~4次的IO即可。
  • 考前複習必備MySQL資料庫(關係型資料庫管理系統)
    InnoDB 數據表的索引限制索引類別普通索引,普通索引(由關鍵字 KEY 或 INDEX 定義的索引)的任務是加快對數據的訪問速度。索引,普通索引允許被索引的數據列包含重複的值。主索引,必須為主鍵欄位創建一個索引,這個索引就是所謂的「主索引」。
  • 面試命中率90%的點——MySQL索引
    1.時間方面:創建索引和維護索引要耗費時間,具體地,當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,會降低增/改/刪的執行效率;三、索引使用場景(重點)上圖中,根據id查詢記錄,因為ID欄位僅建立了主鍵索引,因此此SQL執行可選的索引只有主鍵索引,如果有多個,最終會選一個較優的作為檢索的依據。
  • MySQL資料庫常用操作語言總結
    :DROP USER 'username'@'host';修改用戶密碼:UPDATE mysql.user SET authentication_string=PASSWORD('root') WHERE user='root' ;二、資料庫操作-DDL創建資料庫:CREATE DATABASE databasename
  • 《破壁MySQL》 - MySQL索引
    刪除和插入類似,只不過是自下而上的合併操作。哈希索引哈希索引能以 O(1) 時間進行查找,但是失去了有序性:InnoDB 存儲引擎有一個特殊的功能叫「自適應哈希索引」,當某個索引值被使用的非常頻繁時,會在 B+Tree 索引之上再創建一個哈希索引,這樣就讓 B+Tree 索引具有哈希索引的一些優點,比如快速的哈希查找。
  • mysql field json MySQL JSON 類型數據操作
    test"'='1';https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.htmlmysql>SET@j=』{「a」: 1, 「b」: 2, 「c」: {「d」: 4}}』;mysql>SET@j2=『1』;mysql>SELECTJSON_CONTAINS
  • 圖解MySQL索引:如何正確使用索引?
    選擇性高的列優先關注索引的選擇性。索引的選擇性,也可稱為數據的熵。在創建索引的時候通常要求將選擇性高的列放在最前面,對於選擇性不高的列甚至可以不創建索引。如果選擇性不高,極端性情況下可能會掃描全部或者大多數索引,然後再回表,這個過程可能不如直接走主鍵索引性能高。