老鐵,索引別想亂用
本文轉(zhuǎn)載自微信公眾號(hào)「菜鳥阿都」,作者菜鳥阿都。轉(zhuǎn)載本文請(qǐng)聯(lián)系菜鳥阿都公眾號(hào)。
在web開發(fā)中,使用記錄id獲得詳情信息是一個(gè)比較頻繁的操作,所有必須具有很高的查詢速度,這時(shí),很多小伙伴就會(huì)想到使用索引,在id字段上添加索引。且慢!!! 接下來讓阿都告訴你,為什么攔著你了。
在阿里java開發(fā)手冊(cè)(嵩山版)明確規(guī)定數(shù)據(jù)庫表必備主鍵id,當(dāng)然接下來的操作也必須按照大廠的規(guī)范來,畢竟阿都也有一個(gè)大廠的心。關(guān)注公眾號(hào),并回復(fù):開發(fā)手冊(cè),可獲得阿里java開發(fā)手冊(cè)(嵩山版)。
空洞的言語總是沒有實(shí)際操作具有說服力,開始操作嘍。
開始表演
阿都先創(chuàng)建一個(gè)具有主鍵id的測(cè)試表【user:具有主鍵id】
- CREATE TABLE `user` (
- `id` int NOT NULL,
- `name` varchar(255) NULL,
- PRIMARY KEY (`id`)
- );
一不小心運(yùn)行了查詢索引的命令
- show index FROM user
結(jié)果圖片列字段說明
- Table:表名稱
- Non_unique:如果索引不能包括重復(fù)詞,則為0,反則為1
- Key_name:索引的名稱
- Seq_in_index:索引的列序列號(hào),從1開始
- Column_name:列名稱
尷尬了,竟然還運(yùn)行出了結(jié)果,不知道什么時(shí)候這張新建的user表中已經(jīng)為字段id創(chuàng)建了索引,原來,數(shù)據(jù)庫會(huì)默認(rèn)為主鍵字段創(chuàng)建索引【主鍵索引】,現(xiàn)在知道為什么阿都剛才攔著那些想給id創(chuàng)建索引的小伙伴了吧
為了湊字?jǐn)?shù),順便研究一下,如果表中具有多個(gè)主鍵,數(shù)據(jù)庫會(huì)不會(huì)為每個(gè)主鍵都創(chuàng)建索引,老套路,先建它一張表【user:兩個(gè)主鍵id,name】
- CREATE TABLE `user` (
- `id` int NOT NULL,
- `name` varchar(255) NOT NULL,
- PRIMARY KEY (`id`, `name`)
- );
運(yùn)行命令查看索引
- show index FROM user
數(shù)據(jù)庫為id和name都創(chuàng)建了索引
現(xiàn)在終于有點(diǎn)明白阿里規(guī)范中為什么要求創(chuàng)建主鍵id了,老鐵,別走,順便體驗(yàn)一波id帶了索引的效果
創(chuàng)建具有主鍵id的user表
- CREATE TABLE `user` (
- `id` int NOT NULL,
- `name` varchar(255) NULL,
- PRIMARY KEY (`id`)
- );
創(chuàng)建儲(chǔ)存過程生成100萬條假數(shù)據(jù)
- CREATE PROCEDURE `add_vote_memory1`(IN n int)
- BEGIN
- DECLARE i INT DEFAULT 1;
- WHILE (i <= n ) DO
- INSERT into user (name) VALUEs (FLOOR(RAND() * 1000))
- set i=i+1;
- END WHILE;
- END
- call add_vote_memory1(1000000)insert into user select id,concat('菜鳥阿都',id)) from tmp_series
調(diào)用儲(chǔ)存過程
- call add_vote_memory(1000000)
生成了100萬條假數(shù)據(jù),在本地?cái)?shù)據(jù)庫執(zhí)行這個(gè)儲(chǔ)存過程足足花費(fèi)了10分鐘
- select * from user where id=27
查詢時(shí)間:0.021s
- select * from user where name='adu'
查詢時(shí)間:0.890s
根據(jù)主鍵id查詢與其他字段查詢相比快了45倍,所以小伙伴們,以后設(shè)計(jì)數(shù)據(jù)庫表時(shí),記得加主鍵id。一定要記得。