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