Mysql索引基本概念及案例总结(含索引的使用注意事项)
Mysql索引基本概念及案例總結
鍵(Key)與索引(Index)關鍵字的區別
索引是鍵的列表,當我們定義一個key(外鍵除外,一般是PRIMARY KEY或者KEY形式)時就會產生對應的索引。一般情況下KEY和INDEX關鍵字可以互換。
唯一索引的說明
唯一索引是只允許索引中每個值只能對應一行的索引。這里唯一分兩層含義,在用戶層對應唯一約束,即不能將重復的值插入定義為唯一的字段里,而對于數據庫而言唯一性對應的是唯一索引檢查字段的不重復性。
特別的:對于字段允許為NULL的唯一索引,NULL可以多次插入進去,而不被認為是重復的數據。
主鍵Primary Key的說明
唯一表的主鍵是定義行唯一性的索引,對于主鍵而言,NULL值是不被允許的,即它不能插入到定義為主鍵的字段里。實際上表里任意定義為Unique索引的列就可以作為表的主鍵,但一般選擇其中不經常變的字段。
在InnoDB里主鍵有特殊的用途,在數據庫復制時通過主鍵可以檢測到每一行變化時的時間戳。在組復制(GROUP Replication)時一般明確要求表有主鍵或者有唯一索引。
sql_require_primary_key選項是強制表有主鍵,默認時沒有這個要求(即表必須得有主鍵)。
次(輔助)索引Secondary Indexes的說明
輔助索引是相對于主鍵而言的,除主鍵之外的唯一索引或者普通索引都叫做輔助索引。
聚集索引
在InnoDB里將行數據存儲于B樹索引(B-tree)的葉子頁內的索引叫做聚集索引。因為索引的值聚集在一起,所有有了聚集索引這個名字。主鍵就是用于做聚集索引的。特別的,如果沒有給表設定主鍵,那么InnoD引擎會找唯一不為NULL值的索引作為“主鍵”。如果還是找不到,那么InnoD引擎會加一個隱藏的6字節自增整數,該值相對于InnoD引擎里的所有表都是唯一的。
覆蓋索引
覆蓋索引又稱之為索引的命中,即可我們給出的查詢里所有的字段都被索引覆蓋(命中)。比如一個查詢:
SELECT deptno,deptname FROM dept -- 這里的兩個字段deptno和deptname都能通過某個索引查詢的到,則成為索引命中。這里的兩個字段deptno和deptname都能通過某個索引查詢的到,則成為索引命中。
索引的限制
關于行格式:表的行格式決定了記錄行是物理存儲的形式,同時它也影響到查詢以及數據操作時的效率。如果更多的行填充到磁盤頁里,那么查詢或者索引查找時將更快,數據緩存池里將使用更少緩存,同時也會有更少的I/O讀寫操作。
常見的行格式有:REDUNDANT,?COMPACT,?DYNAMIC, and?COMPRESSED.
| 行格式 | 壓縮存儲特點 | 增強的變長列存儲 | 大索引鍵前綴支持 | 壓力支持 | 支持的表空間類型 |
| REDUNDANT | 否 | 否 | 否 | 否 | system, file-per-table, general |
| COMPACT | 是 | 否 | 否 | 否 | system, file-per-table, general |
| DYNAMIC | 是 | 是 | 是 | 否 | system, file-per-table, general |
| COMPRESSED | 是 | 是 | 是 | 是 | file-per-table, general |
詳細可見:MySQL :: MySQL 8.0 Reference Manual :: 15.10 InnoDB Row Formats
https://dev.mysql.com/doc/refman/8.0/en/create-index.htmlhttps://dev.mysql.com/doc/refman/8.0/en/create-index.html
代碼驗證
創建表時指定索引
CREATE TABLE people ( id int unsigned NOT NULL, name varchar(50), birthdate date NOT NULL, location point NOT NULL SRID 4326, description text, PRIMARY KEY (id), INDEX (name), SPATIAL INDEX (location), FULLTEXT INDEX (description) );注:
總結
以上是生活随笔為你收集整理的Mysql索引基本概念及案例总结(含索引的使用注意事项)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 64式手枪,威力究竟如何?
- 下一篇: 处理字符串_14_SQL处理IN和合并后