mysql索引
参考:mysql索引
前提
索引是有成本的,这主要体现在 会降低插入和修改数据和删除数据的速度
索引是可以加快查询速度的
所以哪些列应该创建索引呢?
1:不需要被频繁更新的列(每秒钟 每分钟都要更新一次)
2:出现在where和join中的列(因为索引是用来做查询的)
索引的优化措施:
索引本身也是有成本的,因为索引需要建立大量的硬盘空间 去存放索引列,
1:如果一个字符串长度是100,如果我们可以确定,该字符串前10个字符 已经可以做到唯一了,则可以设置只针对前10个字符进行索引
2:索引列的基数越大,索引的效果越好。
3:最左前缀原则:mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
4:应尽量避免在 where 子句中使用 or 来连接条件
如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where num=10 or Name = 'fuzhu'
可以这样查询,充分利用索引:
select id from t where num = 10
union all
select id from t where Name = 'fuzhu'
5:like %keyword或%keyword%索引失效,like keyword% 索引有效
什么时候需要使用索引
索引本身是比较消耗资源的,其在加快查询速度的同时,降低了 增删改的速度,索引在使用索引的时候 需要权衡一下利弊
1:如果一个表的记录只有一两千条 则没有必要使用索引
2:一个列如果其中 重复的值比较多,则没有必要使用索引
3:一个表 不要设置太多的索引
普通索引 唯一索引 主键索引 全文索引
上面四个索引分别代表不同情况下的索引,
普通索引:最基本的索引
唯一所以:加上一个约束条件:内容不可重复
主键索引:再加上一个约束,不可以有null值
全文索引:主要是解决 文本匹配问题,其效率要高于like