一,主键和索引:
1,主键是为了唯一标识表格的行数据,类似书本的页码
2,索引更多是为了快速查询表格的数据,类似书本的目录
3,表格列可设为主键,也可设为索引,或者即是主键也是索引
由此可知
1,主键必须是唯一的,而索引不一定;
2,即是主键也是索引的列,肯定是唯一的;
以user表为例
CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, `age` int(11) NOT NULL, `email` varchar(100) NOT NULL, /* id 列即是主键PRIMARY,也是索引KEY,而且数值是唯一的 */ PRIMARY KEY (`id`), /* email 列是唯一性UNIQUE索引,数值必须唯一 */ UNIQUE KEY `email` (`email`), /* age 列是普通型索引,数值可以相同 */ KEY `age` (`age`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
二,关于索引
1,主键型索引:数值必须唯一,通常默认建立
2,普通型索引:数值可以重复
/* 创建索引 */ create index age on user(age); /* 或者 */ ALTER TABLE `user` ADD INDEX age ( `age` ); /* 删除索引 */ drop index age on user; /* 或者 */ ALTER TABLE user DROP INDEX age;
3,唯一性索引:数值必须唯一
/* 创建索引 */ create UNIQUE index email user(email); /* 或者 */ ALTER TABLE `user` ADD UNIQUE email( `email` ); /* 删除索引 */ drop index email on user; /* 或者 */ ALTER TABLE user DROP INDEX email;
4,全文型索引:生成全文索引非常消耗时间和硬盘空间,避免在大数据表格创建
/*修改表结构添加全文索引*/ ALTER TABLE post ADD FULLTEXT content on (content) /*直接创建索引*/ CREATE FULLTEXT INDEX content ON post (content)
5,组合索引:多个列组合成索引,采用最左前缀组合,比如以下
/* 创建组合组合 */ ALTER TABLE post ADD INDEX title_time (title,time); /* 其实这里创建了两个索引 1,title,time 2,title 但是没有单独 time 的索引,因为MySQL采用最左前缀方式组合的 */ /* 会使用索引 */ SELECT * FROM post WHREE title='test' AND time='2015-01-01'; SELECT * FROM post WHREE title='test'; /* 不会使用索引 */ SELECT * FROM post WHREE time='2015-01-01';
Leave a Reply