MySQL筆記7:索引
阿新 • • 發佈:2022-05-18
7. 索引
Msql官方對索引的定義為:索引(index)是幫助MySQL高效獲取資料的資料結構。
提取句子主幹,就可以得到索引的本質:索引是資料結構。
7.1 索引的分類
主鍵索引只能有一個, 唯一索引可以有多個
- 主鍵索引 (primary key)
- 唯一標識,主鍵不可重複,只能有一個列作為主鍵
- 唯一索引 (unique key)
- 避免列中出現重複的資料,唯一索引可以有多個,多個列都可以標識為唯一索引
- 常規索引(key / index)
- 預設的,可以使用key / index關鍵字設定
- 全文索引 (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(studentName) AGAINST('李');
7.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萬條資料
-- 插入100w條資料
DROP FUNCTION IF EXISTS mock_data;
DELIMITER $$ -- 寫函式之前必寫,標誌
-- 建立函式
CREATE FUNCTION mock_data()
RETURNS INT
DETERMINISTIC -- 8.0需要新增
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_data(); -- 執行函式
直接查詢
SELECT * FROM app_user WHERE `name` = '使用者9999'; -- 1.058
EXPLAIN SELECT * FROM app_user WHERE `name` = '使用者9999'; -- 檢視執行狀態
需要查詢資料的數量:rows
構建索引後查詢
建立索引,為資料構造了一顆新的樹
建立索引:CREATE INDEX 索引名 on 表(欄位)
索引名:id_表名_欄位名
CREATE INDEX id_app_user_name ON app_user(`name`); -- 建立索引,新建一顆樹
SELECT * FROM app_user WHERE `name` = '使用者9999'; -- 0.001 sec
EXPLAIN SELECT * FROM app_user WHERE `name` = '使用者9999';
需要查詢的數量:rows
7.3 索引原則
- 索引不是越多越好(佔用空間
- 不要對程序變動的資料加索引(頻繁刪改
- 小數量的表不需要加索引
- 索引一般加在常用來查詢的欄位上
索引的資料結構
預設建立時:Hash型別的索引
InnoDB預設資料結構:Btree/B-tree(B+樹)