11-MySQL-索引的分類、測試索引、索引原則
阿新 • • 發佈:2021-01-12
MySQL -> 索引 -> 索引的分類、測試索引、索引原則
MySQL官方對索引的定義為:索引(index)是幫助MySQL高效獲取資料的資料結構。
提取句子主幹,就可以得到索引的本質——索引是資料結構。
1. 索引的分類
在一個表中,主鍵索引只能有一個,唯一索引可以有多個
-
主鍵索引 PRIMARY KEY
- 唯一的標識,主鍵不可重複,只能有一個列作為主鍵
-
唯一索引 UNIQUE KEY
- 避免重複的列出現,唯一索引可以重複,多個列都可以標誌為唯一索引
-
常規索引 KEY/INDEX
- 預設的,index,key關鍵字來設定
-
全文索引 FULLTEXT
- 在特定的資料庫引擎下才有,MyISAM
- 快速定位
-
基礎語法:
-- 索引的使用 -- 1、在建立表的時候給欄位增加索引 -- 2、建立表完畢後,增加索引 -- 顯示所有的索引資訊 SHOW INDEX FROM student -- 增加一個索引 ALTER TABLE school.`student` ADD FULLTEXT INDEX `StudentName`(`StudentName`); -- EXPLAIN 分析sql執行的狀況 EXPLAIN SELECT * FROM student EXPLAIN SELECT * FROM student WHERE MATCH(
2. 測試索引
CREATE TABLE `app_user`(
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) DEFAULT '' COMMENT '使用者暱稱',
`email` VARCHAR(50) NOT NULL COMMENT '使用者郵箱',
`phone` VARCHAR(20) DEFAULT '' COMMENT '手機號',
`gender` TINYINT(4) UNSIGNED DEFAULT '0' COMMENT '性別(0:男;1:女)',
`password` VARCHAR(100) NOT NULL COMMENT '密碼',
`age` TINYINT(4) DEFAULT '0' COMMENT '年齡',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`update_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='app使用者表'
-- 插入100萬資料
DELIMITER $$ -- 寫函式之前必須要寫,標誌
CREATE FUNCTION mock_date()
RETURNS INT
BEGIN
DECLARE num INT DEFAULT 1000000;
DECLARE i INT DEFAULT 0;
WHILE i<num DO
INSERT INTO app_user(`name`,`email`,`phone`,`gender`,`password`,`age`)
VALUES (CONCAT('使用者',i),'[email protected]',CONCAT('18',FLOOR(RAND()*((999999999-100000000)+100000000))),FLOOR(RAND()*2),UUID(),FLOOR(RAND()*100));
SET i = i+1;
END WHILE;
RETURN i;
END;
SELECT mock_date();
SELECT * FROM app_user WHERE `name` = '使用者9999'; -- 0.530 sec
SELECT * FROM app_user WHERE `name` = '使用者9999'; -- 0.499 sec
SELECT * FROM app_user WHERE `name` = '使用者9999'; -- 0.483 sec
EXPLAIN SELECT * FROM app_user WHERE `name` = '使用者9999';
CREATE INDEX id_app_user_name ON app_user(`name`);
SELECT * FROM app_user WHERE `name` = '使用者9999'; -- 0.010 sec
SELECT * FROM app_user WHERE `name` = '使用者9999'; -- 0.001 sec
EXPLAIN SELECT * FROM app_user WHERE `name` = '使用者9999';
- 索引在小資料量的時候,用處不大;但在大資料量的情況下,區別十分明顯。
3. 索引原則
- 索引不是越多越好
- 不要對經常變動資料加索引
- 小資料量的表不需要加索引
- 索引一般加在常用來查詢的欄位上
索引的資料結構
BTREE :INNODB預設的資料結構