MySQL索引是什么
新华字典的 目录 相对于字典中的 内容 就类似于数据库的 索引 类似于数据库中 数据 。
MySQL索引有什么用
像上述描述一样,目录是为了快速便捷查找内容,索引也一样。加快数据检索速度。
当然看待事物都是辩证性的,有优点就有缺点。
加上目录意味着要多用一些纸,分类越多消耗越多(按拼音、部首、偏旁等)。加上目录的前提下如果要在字典里新增/删除/修改一个字,对应的目录是不是也要调整。同理,索引也一样:
建立索引会占用磁盘空间的索引文件;
降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。
MySQL索引分类
- 单列索引
- 主键索引:列的值不允许重复,不允许有空值,如常见的id。一个表只能有一个主键。
- 唯一索引:列的值不允许重复,允许有空值
- 普通索引:最基本的索引,char和varchar可以指定length建立前n个字符的索引,blob和text类型必须制定length。
- 全文索引:只有在char、varchar、text使用,用来查找文本中的关键字,配合match against操作。
- 组合索引:多个列组合成的索引。使用时遵循最左前缀集合。
#普通索引 建表时:index indexname(‘字段名‘(length)) 建表后:create index indexname on ’tablename’(‘字段名’(length)) Alter table tablename add index indexname(‘字段名‘(length))
#唯一索引 建表时:unique index indexname(‘字段名‘(length)) 建表后:create unique index indexname on ’tablename’(‘字段名’(length)) Alter table tablename add unique index indexname(‘字段名‘(length))
#主键索引 primary key
#全文索引 建表时:fulltext index indexname(‘字段名‘(length)) 建表后:create fulltext index indexname on ’tablename’(‘字段名’(length)) Alter table tablename add fulltext index indexname(‘字段名‘(length)) 使用:select * from tablename where match(column1,column2) against(‘xxx’,’sss’,’ddd’);查找column1column2中含xxx,sss,ddd的记录
#组合索引
建表时:index indexname(‘字段名‘(length),‘字段名‘(length))
建表后:create index indexname on ’tablename’(‘字段名’(length),‘字段名‘(length))
Alter table tablename add index indexname(‘字段名‘(length),‘字段名‘(length))
索引删除
drop index indexname on tablename
索引失效情况
1、条件中使用了or
除非每个or的条件都建索引
2、遵循最左前缀规则
3、使用范围查询。以%、<、>开头或使用,其右边所有列无法使用索引
4、列类型为字符串,查询的数据必须用引号引起来,否则不使用索引
5、索引列不能是表达式或函数的一部分