1.添加PRIMARY KEY(主鍵索引)
創(chuàng)新互聯(lián)公司是一家專(zhuān)注于做網(wǎng)站、網(wǎng)站制作與策劃設(shè)計(jì),城子河網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:城子河等地區(qū)。城子河做網(wǎng)站價(jià)格咨詢(xún):028-86922220
mysqlALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2.添加UNIQUE(唯一索引)
mysqlALTER TABLE `table_name` ADD UNIQUE (
`column`
)
3.添加INDEX(普通索引)
mysqlALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4.添加FULLTEXT(全文索引)
mysqlALTER TABLE `table_name` ADD FULLTEXT ( `column`)
5.添加多列索引
mysqlALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
CREATE TABLE `test` ('aaa' varchar(16) NOT NULL default '', 'bbb' varchar(16) NOT NULL default '', 'ccc' int(11) UNSIGNED NOT NULL default 0, KEY `sindex` (`aaa`,`bbb`,`ccc`) ) ENGINE=MyISAM COMMENT='';\x0d\x0a\x0d\x0a這樣就在 aaa、bbb、ccc 3列上建立聯(lián)合索引了。\x0d\x0a\x0d\x0a如果表已經(jīng)建好了,那么就在phpmyadmin里面執(zhí)行:\x0d\x0aalert table test add INDEX `sindex` (`aaa`,`bbb`,`ccc`) \x0d\x0a\x0d\x0a就可以在這3列上建立聯(lián)合索引了。
一、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)
);
MySQL數(shù)據(jù)庫(kù)建立索引步驟:
1、使用SQLPlus或者PLSQL登錄MySQL數(shù)據(jù)庫(kù)。
2、執(zhí)行語(yǔ)句create
index
indexname
on
table(col)
tablespace
tablespacename;其中
"indexname"為需要建立索引的索引名;
"table"是需要建立索引的表;
"col"為需要建立索引的字段列;
”tablespacename“為建立索引存放的空間(如果不需要制定表空間則使用“create
index
indexname
on
table(col)”)。
在實(shí)際開(kāi)發(fā)中使用數(shù)據(jù)庫(kù)時(shí),難免會(huì)遇到一些大表數(shù)據(jù),對(duì)這些數(shù)據(jù)進(jìn)行查詢(xún)時(shí),有時(shí)候SQL會(huì)查詢(xún)得特別慢,這時(shí)候,有經(jīng)驗(yàn)的老師傅會(huì)告訴你,你看一下哪幾個(gè)字段查的多,加一個(gè)索引就好了。
那么,怎么合理地建立索引呢?這里分享一下我的一些經(jīng)驗(yàn),如有不妥之處,歡迎批評(píng)指正。
1、不要盲目建立索引 , 先分析再創(chuàng)建
索引雖然能大幅度提升我們的查詢(xún)性能,但也要知道,在你進(jìn)行增刪改時(shí),索引樹(shù)也要同樣地進(jìn)行維護(hù)。所以,索引不是越多越好,而是按需建立。最好是在一整塊模塊開(kāi)發(fā)完成后,分析一下,去針對(duì)大多數(shù)的查詢(xún),建立聯(lián)合索引。
2、使用聯(lián)合索引盡量覆蓋多的條件
這是說(shuō)在一個(gè)慢sql里假如有五個(gè)where ,一個(gè) order by ,那么我們的聯(lián)合索引盡量覆蓋到這五個(gè)查詢(xún)條件,如果有必要,order by 也覆蓋上 。
3、小基數(shù)字段不需要索引
這個(gè)意思是,如果一張表里某個(gè)字段的值只有那么幾個(gè),那么你針對(duì)這個(gè)字段建立的索引其實(shí)沒(méi)什么意義,比如說(shuō),一個(gè)性別字段就兩種結(jié)果,你建了索引,排序也沒(méi)什么意思(也就是索引里把男女給分開(kāi)了)
所以說(shuō),索引盡量選擇基數(shù)大的數(shù)據(jù)去建立,能最大化地利用索引
4、長(zhǎng)字符串可以使用前綴索引
我們建立索引的字段盡量選擇字段類(lèi)型較小的,比如一個(gè)varchar(20)和varchar(256)的,我們?cè)?0的上面建立的索引和在256上就有明顯的差距(字符串那么長(zhǎng)排序也不好排呀,唉)。
當(dāng)然,如果一定是要對(duì)varchar(256)建立索引,我們可以選擇里面的前20個(gè)字符放在索引樹(shù)里(這里的20不絕對(duì),選擇能盡量分辨數(shù)據(jù)的最小字符字段設(shè)計(jì)),類(lèi)似這樣KEY index(name(20),age,job) ,索引只會(huì)對(duì)name的前20個(gè)字符進(jìn)行搜索,但前綴索引無(wú)法適用于order by 和 group by。
5、對(duì)排序字段設(shè)計(jì)索引的優(yōu)先級(jí)低
如果一個(gè)SQL里我們出現(xiàn)了范圍查找,后邊又跟著一個(gè)排序字段,那么我們優(yōu)先給范圍查找的字段設(shè)置索引,而不是優(yōu)先排序。
6、如果出現(xiàn)慢SQL,可以設(shè)計(jì)一個(gè)只針對(duì)該條SQL的聯(lián)合索引。
不過(guò)慢SQL的優(yōu)化,需要一步步去進(jìn)行分析,可以先用explain查看SQL語(yǔ)句的分析結(jié)果,再針對(duì)結(jié)果去做相應(yīng)的改進(jìn)。explain的東西我們下次再講。
PS:在 select 語(yǔ)句之前增加 explain 關(guān)鍵字,MySQL 會(huì)在查詢(xún)上設(shè)置一個(gè)標(biāo)記,執(zhí)行查詢(xún)會(huì)返回執(zhí)行計(jì)劃的信息,而不是 執(zhí)行這條SQL。