分幾種類(lèi)型:
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的蓮都網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
1.添加PRIMARY KEY(主鍵索引)
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2.添加UNIQUE(唯一索引)
ALTER TABLE `table_name` ADD UNIQUE (
`column`
)
3.添加INDEX(普通索引)
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4.添加FULLTEXT(全文索引)
ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
5.添加多列索引
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
字符串創(chuàng)建索引方式:
1、直接創(chuàng)建完整索引,比較占用空間。
2、創(chuàng)建前綴索引,節(jié)省空間,但會(huì)增加查詢(xún)掃描次數(shù),并且不能使用覆蓋索引。
3、倒序存儲(chǔ),在創(chuàng)建前綴索引,用于繞過(guò)字符串本身前綴的卻分度不夠的問(wèn)題。
4、創(chuàng)建hash字段索引,查詢(xún)性能穩(wěn)定,有額外的存儲(chǔ)和計(jì)算消耗。
倒序存儲(chǔ)和hash字段索引都不支持范圍查詢(xún)。倒序存儲(chǔ)的字段上創(chuàng)建的所有是按照倒序字符串的方式排序的。hash字段的方式也只能支持等值查詢(xún)。
mysql alter table SUser add index index1(email); :包含了每個(gè)記錄的整個(gè)字符串
或
mysql alter table SUser add index index2(email(6)); :-對(duì)于每個(gè)記錄只取前6個(gè)字節(jié)
全字段索引操作流程
使用的是 index1(即 email 整個(gè)字符串的索引結(jié)構(gòu)),執(zhí)行順序是這樣的:
1、從 index1 索引樹(shù)找到滿足索引值是’ zhangssxyz@xxx.com ’的這條記錄,取得 ID2 的值;
2、到主鍵上查到主鍵值是 ID2 的行,判斷 email 的值是正確的,將這行記錄加入結(jié)果集;
3、取 index1 索引樹(shù)上剛剛查到的位置的下一條記錄,發(fā)現(xiàn)已經(jīng)不滿足 email=' zhangssxyz@xxx.com ’的條件了,循環(huán)結(jié)束。
前綴字段索引操作流程
如果使用的是 index2(即 email(6) 索引結(jié)構(gòu)),執(zhí)行順序是這樣的:
1、從 index2 索引樹(shù)找到滿足索引值是’zhangs’的記錄,找到的第一個(gè)是 ID1;
2、到主鍵上查到主鍵值是 ID1 的行,判斷出 email 的值不是’ zhangssxyz@xxx.com ’,這行記錄丟棄;
3、取 index2 上剛剛查到的位置的下一條記錄,發(fā)現(xiàn)仍然是’zhangs’,取出 ID2,再到 ID 索引上取整行然后判斷,這次值對(duì)了,將這行記錄加入結(jié)果集;
4、重復(fù)上一步,直到在 idxe2 上取到的值不是’zhangs’時(shí),循環(huán)結(jié)束。
倒序查詢(xún)和hash字段的區(qū)別
它們的區(qū)別,主要體現(xiàn)在以下三個(gè)方面:
1、從占用的額外空間來(lái)看,倒序存儲(chǔ)方式在主鍵索引上,不會(huì)消耗額外的存儲(chǔ)空間,而 hash 字段方法需要增加一個(gè)字段。當(dāng)然,倒序存儲(chǔ)方式使用 4 個(gè)字節(jié)的前綴長(zhǎng)度應(yīng)該是不夠的,如果再長(zhǎng)一點(diǎn),這個(gè)消耗跟額外這個(gè) hash 字段也差不多抵消了。
2、在 CPU 消耗方面,倒序方式每次寫(xiě)和讀的時(shí)候,都需要額外調(diào)用一次 reverse 函數(shù),而 hash 字段的方式需要額外調(diào)用一次 crc32() 函數(shù)。如果只從這兩個(gè)函數(shù)的計(jì)算復(fù)雜度來(lái)看的話,reverse 函數(shù)額外消耗的 CPU 資源會(huì)更小些。
3、從查詢(xún)效率上看,使用 hash 字段方式的查詢(xún)性能相對(duì)更穩(wěn)定一些。因?yàn)?crc32 算出來(lái)的值雖然有沖突的概率,但是概率非常小,可以認(rèn)為每次查詢(xún)的平均掃描行數(shù)接近 1。而倒序存儲(chǔ)方式畢竟還是用的前綴索引的方式,也就是說(shuō)還是會(huì)增加掃描行數(shù)。
1.添加PRIMARY KEY(主鍵索引):
2.添加UNIQUE(唯一索引) :
3.添加INDEX(普通索引) :
4.添加FULLTEXT(全文索引) :
5.添加多列索引:
select (*) from tb_name where create_time xxx;
最終得知是因?yàn)檫@個(gè)表數(shù)據(jù)行數(shù)已經(jīng)超過(guò) 一千萬(wàn)了,然后create_time字段又沒(méi)有索引 。
那解決辦法肯定是加索引嘍。
但是這個(gè)表是一直在線上運(yùn)行,很重要和業(yè)務(wù)部分。如果給千萬(wàn)級(jí)的大表在線加索引 ,肯定會(huì)卡死。
然后就搜羅了一大筐解決方案,比如 在線無(wú)鎖加索引使用
ALTER TABLE tbl_name ADD PRIMARY (column), ALGORITHM=INPLACE, LOCK=NONE;
后來(lái)才發(fā)現(xiàn),這個(gè)特性是 Mysql 5.6 以后才支持,然而我們的mysql用的是5.5版本
最后在 《高性能Mysql》一書(shū)中看到,可在通過(guò) “影子拷貝”來(lái)解決,
就是 先創(chuàng)建一張和源表無(wú)關(guān)的新表,然后通過(guò)重命名和刪表操作交換兩張表;
當(dāng)給新表加完索引后,最上面那條查詢(xún)直接就是0.0002s
場(chǎng)景:在給一張有幾萬(wàn)條記錄的表添加索引時(shí),進(jìn)度非常慢,導(dǎo)致其它查詢(xún)無(wú)法進(jìn)行
處理方式:
使用Navicat的命令行模式,執(zhí)行以下命令:
show processlist;
這時(shí)會(huì)看到有哪些線程正在執(zhí)行,也可以查看鎖表的線程。你會(huì)發(fā)現(xiàn)alter table * add key ****那個(gè)線程狀態(tài)是Waiting for table metadata lock,后面有個(gè)這個(gè)表的所有操作都是這個(gè)狀態(tài),很明顯是這條加索引的語(yǔ)句把表給鎖了。
查看線程ID,執(zhí)行
kill 線程ID
這樣被鎖住的表就能立即被使用了。
由此得出一個(gè)結(jié)論,當(dāng)一張表數(shù)據(jù)量很大時(shí),不要輕易添加索引,會(huì)導(dǎo)致表被鎖死!如果非要添加,那么應(yīng)該先把數(shù)據(jù)表進(jìn)行備份,然后進(jìn)行空表添加索引。
只能通過(guò)ALTER TABLE不能create index
參數(shù)說(shuō)明:
兄弟,primary key是主鍵,每個(gè)表只能有一個(gè)主鍵,而且數(shù)據(jù)是唯一的。\x0d\x0a可以這樣寫(xiě):\x0d\x0aCREATE TABLE IF NOT EXISTS `".$ctb_name."` (\x0d\x0a `id` INT(9) NOT NULL AUTO_INCREMENT PRIMARY KEY,\x0d\x0a `keyid` VARCHAR(20) NOT NULL,\x0d\x0a `key` VARCHAR(20) NOT NULL,\x0d\x0a `stauts` BOOL NOT NULL DEFAULT'0',\x0d\x0aindex `idx_status`(`status`)\x0d\x0a )ENGINE = MYISAM DEFAULT CHARSET=utf8;\x0d\x0a不過(guò),status是bool類(lèi)型的字段,只有true和false,區(qū)分度太低,沒(méi)有必要加索引。\x0d\x0a\x0d\x0a索引目的是為了使查詢(xún)更快,區(qū)分度小的時(shí)候不如全表掃描。
一、CREATE INDEX方法
CREATE INDEX 索引名 ON 表名 (列名 [長(zhǎng)度] [ ASC | DESC])
限制:只能增加普通索引INDEX和UNIQUE INDEX索引這兩種;不能創(chuàng)建PRIMARY KEY索引
二、ALTER TABLE方法
ALTER TABLE 表名 ADD INDEX [索引名] (列名,…)
ALTER TABLE 表名 ADD UNIQUE [ INDEX | KEY] [索引名] (列名,…)
ALTER TABLE 表名 ADD PRIMARY KEY (列名,…)
ALTER TABLE 表名 ADD FOREIGN KEY [索引名] (列名,…)
三、CREATE TABLE時(shí)候指定
創(chuàng)建一般索引
CREATE TABLE tb_stu_info
(
id INT NOT NULL,
name CHAR(45) DEFAULT NULL,
dept_id INT DEFAULT NULL,
age INT DEFAULT NULL,
height INT DEFAULT NULL,
INDEX(height)
);
創(chuàng)建唯一索引
mysql CREATE TABLE tb_stu_info2
(
id INT NOT NULL,
name CHAR(45) DEFAULT NULL,
dept_id INT DEFAULT NULL,
age INT DEFAULT NULL,
height INT DEFAULT NULL,
UNIQUE INDEX(height)
);
創(chuàng)建主鍵(雖然ALTER TABLE也能創(chuàng)建,但主鍵一般都在創(chuàng)表時(shí)建立)
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
PRIMARY KEY(ID)
);
分享標(biāo)題:mysql索引怎么添加,mysql索引添加原則
標(biāo)題URL:http://vcdvsql.cn/article30/hsesso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、服務(wù)器托管、網(wǎng)站策劃、定制網(wǎng)站、小程序開(kāi)發(fā)、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)