706   MySQL

一,主键和索引:
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

Your email address will not be published. Required fields are marked *