<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Mysql官方對索引的定義是:索引(index)是幫助Mysql高效獲取資料的資料結構。進而,我們可以知道索引的本質是資料結構。
主鍵索引:也就是我們常見的 PRIMARY KEY,只有一個列作為主鍵,唯一標識,不可重複。
唯一索引:UNIQUE KEY,避免重複的列出現,唯一索引是可以有多個,同一張表裡的多個列都可以設定唯一索引。
常規索引:KEY/INDEX,預設的型別,通過關鍵字INDEX或者KEY來設定。
全文索引:FullText,在特定的資料庫引擎下才支援,作用是快速定位資料。
在建立表或者建立之後,都可以給欄位增加索引。
比如現在建立一個測試用的表,我先在建立的時候加了前三種型別的索引:
-- 建立表 CREATE TABLE `student`( `StudentNo` INT(4) NOT NULL COMMENT "學號", `LoginPwd` VARCHAR(20) DEFAULT NULL, `StudentName` VARCHAR(20) DEFAULT NULL COMMENT "學生姓名", `Sex` TINYINT(1) DEFAULT NULL COMMENT "性別:0-1", `GradeId` INT(11) DEFAULT NULL COMMENT "年紀編號", `Phone` VARCHAR(50) NOT NULL COMMENT "聯絡電話", `Address` VARCHAR(255) NOT NULL COMMENT "地址", `BornDate` DATETIME DEFAULT NULL COMMENT "出生日期", `Email` VARCHAR(50) NOT NULL COMMENT "郵箱", `IdentityCard` VARCHAR(18) DEFAULT NULL COMMENT "身份證號", PRIMARY KEY (`StudentNo`), -- 主鍵索引 UNIQUE KEY `IdentityCard` (`IdentityCard`), -- 唯一索引,前面是索引名稱,括號裡是欄位名 KEY `Email` (`Email`) -- 常規索引 )ENGINE=INNODB DEFAULT CHARSET=utf8;
執行sql,建立表成功。這時候我繼續增加一個全文索引。
-- 增加一個全文索引型別,前面是索引名稱,括號裡是欄位名 ALTER TABLE `school`.`student` ADD FULLTEXT INDEX `StudentName` (`StudentName`);
可以檢視student表的所有索引SHOW INDEX FROM student;
還有第三種,CREATE INDEX 索引名 on 表(欄位),到後面演示。
-- 建立表 CREATE TABLE `app_user`( `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) DEFAULT '' COMMENT '暱稱', `email` VARCHAR(50) DEFAULT NULL COMMENT "郵箱", `phone` VARCHAR(20) DEFAULT NULL COMMENT "手機號", `gender` TINYINT(4) DEFAULT NULL COMMENT "性別 0-男, 1-女", `password` VARCHAR(100) NOT NULL COMMENT "密碼", `age` TINYINT(4) NOT NULL 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=utf8 COMMENT='app使用者表';
執行建立成功,現在插入資料。
-- 插入百萬資料 DELIMITER $$ CREATE FUNCTION mock_data() RETURNS INT BEGIN DECLARE num INT DEFAULT 1000000; DECLARE i INT DEFAULT 0; WHILE i < num DO -- 插入語句 INSERT INTO `school`.`app_user`(`name`,`email`,`phone`,`gender`,`password`,`age`)VALUES (CONCAT('使用者',i), '123456@qq.com', CONCAT('18', FLOOR(RAND()*((999999999-100000000)+100000000))), FLOOR(RAND()*2), UUID(), FLOOR(RAND()*100)); SET i = i+1; END WHILE; RETURN i; END;
執行可能會出現This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary報錯。
如果出現,可以先執行set global log_bin_trust_function_creators=TRUE ,然後再試下。
執行成功後,再執行:
SELECT mock_data();
大概持續1分鐘左右,別急。
未加索引
查詢一條資料。
SELECT * FROM `app_user` WHERE `name`='使用者9999'
多次執行查詢,發現花費時間,穩定在0.63s左右,這個從點選執行到看到結果,已經從肉眼可以感知有點慢了。
我們可以增加關鍵詞EXPLAIN分析sql執行的情況。
EXPLAIN SELECT * FROM `app_user` WHERE `name`='使用者9999'
可以看到這個語句查了99W+條,這都是時間消耗。
新增索引
用上面說的第三種方式,增加一個常規索引。
CREATE INDEX id_app_user_name ON app_user(`name`);
再重新執行下查詢:
SELECT * FROM `app_user` WHERE `name`='使用者9999'
查詢時間大幅縮短,只需要要0.1s+。
再分析下加了索引後的查詢。
EXPLAIN SELECT * FROM `app_user` WHERE `name`='使用者9999'
只查了一條,精準查詢。
索引雖然好用,但是不可以濫用,這裡有幾個原則可以記一下:
以上就是對索引的簡單介紹,但是MySQL索引背後的資料結構及演演算法原理,東西可就多了,有一個大佬講的挺細的,有興趣可以翻下,傳送門
以上就是Mysql資料庫百萬資料測試索引效果的詳細內容,更多關於Mysql百萬資料測試索引的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45