MySQL 索引
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。
拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
建立索引会占用磁盘空间的索引文件。
总体分析
PRIMARY, INDEX, UNIQUE 这3种是一类
PRIMARY 主键。 就是 唯一 且 不能为空。
INDEX 索引,普通的
UNIQUE 唯一索引。 不允许有重复。
普通索引
创建索引
这是最基本的索引,它没有任何限制。它有以下几种创建方式
创建表sql
CREATE TABLE t(
c1 INT PRIMARY KEY,
c2 INT NOT NULL,
c3 INT NOT NULL,
c4 VARCHAR(10),
INDEX (c2,c3)
);
但是要为列或一组列添加索引,可以使用CREATE INDEX语句,如下所示:
CREATE INDEX index_name ON table_name (column_list)
实例
CREATE INDEX idx_c4 ON t(c4);
查看索引
SHOW INDEXES FROM t;
唯一索引:
这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一
1:添加UNIQUE(唯一索引)
ALTER TABLE t ADD UNIQUE (c3)
2:添加PRIMARY KEY(主键索引)
MYSQL主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”。
在创建表的时候,指定主键索引
create table table_primarykey
( id int primary key auto_increment ,
name varchar(20)
);
l另外一中方式:
create table table_primarykey
( id int,
name varchar(20)
);
alter table table_primarykey add primary key (id);
3:添加FULLTEXT(全文索引)
MySQL从3.23.23版开始支持全文索引和全文检索。在MySQL中,全文索引的索引类型为FULLTEXT。全文索引可以在CHAR、VARCHAR或者TEXT类型的列上创建。它可以通过CREATE TABLE命令创建,也可以通过ALTER TABLE或CREATE INDEX命令创建。对于大规模的数据集,通过ALTER TABLE(或者CREATE INDEX)命令创建全文索引要比把记录插入带有全文索引的空表更快。
语句介绍:WHERE MATCH(COLUMN_NAME) AGAINST('KEY_WORD1,KEY_WORD2' IN BOOLEAN MODE)
索引名称:FULLTEXT
支持类型:char、varchar、text
以下依次是增、删、查全文索引示例:
alter table xxf_witkey_article ADD FULLTEXT username(art_title);
DROP INDEX username ON xxf_witkey_article;
SELECT * FROM `xxf_witkey_article` WHERE MATCH(art_title) AGAINST('kkkk');
4:添加多列索引
ALTER TABLE t ADD INDEX index_name ( c2,c3,c4 )
下面是更加详细的方法
MySQL中可以使用alter table这个SQL语句来为表中的字段添加索引。
使用alter table语句来为表中的字段添加索引的基本语法是:
ALTER TABLE <表名> ADD INDEX (<字段>);
我们来尝试为test中t_name字段添加一个索引。
mysql> alter table test add index(t_name);
Query OK, 0 rows affected (0.17 sec)
Records: 0 Duplicates: 0 Warnings: 0
删除索引:
删除索引可以使用ALTER TABLE或DROP INDEX语句来实现;
drop index index_name(数据库名称) on table_name (表名);
alter table t drop index c2;
alter table t drop primary key ;
查看所有索引:
SHOW INDEXES FROM t;