MySQL索引[数据库教程]

database

什么是索引?

排好序快速查找的数据结构就是索引

索引作用

提高检索效率,降低数据库对IO成本;降低数据排序,减少cpu消耗

索引类型

单值索引:一个索引包含单个列,一个表可以有多个单值索引

唯一索引:索引值必须唯一,但允许有空值

复合索引:一个索引包含多个列

基本语法

创建索引

CREATE [UNIQUE](唯一) INDEX  indexname(索引名称) ON tablename(表名) (columnname(length)字段和类型)  

该命令可以添加普通索引或唯一索引[UNIQUE]

或者

ALTER TABLE tablename ADD PRIMARY KEY (columnname_list)                          ---主键索引

ALTER TABLE tablename ADD  INDEX  UNIQUE  indename(columnname_list)     ---唯一索引

ALTER TABLE tablename ADD  INDEX  indename(columnname_list)                      ---普通索引

ALTER TABLE tablename ADD  INDEX  FULLTEXT indename(columnname_list)   ---全文索引

删除索引

DROP INDEX [indexname]  ON table

查看索引

SHOW INDEX FROM  table 

那些情况需要创建索引

  • 主键自动创建索引
  • 频繁作为查询条件的字段
  • 连表关联的字段,外键关系创建索引
  • 高并发下创建复合索引
  • where字段
  • 排序的字段
  • 查询中统计或分组的字段

如果表记录太少,经常增删改的表,某列字段重复数据较多就不要建立索引

索引优化

  1.  索引有多列时,遵循左前法则;顺序从左开始且不要跳过中间的索引,否则索引失效全盘扫描(带头大哥不能死,中间兄弟不能断)
  2. 不要再索引列上做任何操作,包括计算、函数、自动或者手动类型转换,否则导致索引失效(索引列上无计算)
  3. 范围条件查询之后的索引全部失效,使用范围查询时,有时会使用索引,有时会失效,这是因为使用范围条件的数据量有一定的范围(范围之后全失效)
  4. 索引列尽量和查询列一致,减少select *
  5. 使用“<>”或“!=”导致索引失效
  6. is null,is not null也会导致索引失效
  7. like的“%”在右边不会导致索引失效;查询的列匹配索引列,使用like ‘%xxx%’索引不会失效(like%加右边)
  8. 字符串不加单引号或导致索引失效(字符串里有引号)
  9. or用来连接时导致索引失效,但是可以把or用union all代替

关联查询优化

  • 保证被驱动表的join字段已经被索引
  • left join 时,选择小表作为驱动表,大表作为被驱动表
  • inner join 时,mysql会自己帮你把小结果集的表选为驱动表
  • 子查询尽量不要放在被驱动表,有可能使用不到索引

子查询优化

  • 在使用"in"时,用大表驱动小表,"exists"时用小表驱动大表

order by关键字优化

  • ORDER BY子句,尽量使用Index方式排序,避免使用FileSort方式排序
  • 尽可能在索引列上完成排序操作,遵照索引建的最佳左前缀
  • where子句中如果出现索引的范围查询(即explain中出现range)会导致order by 索引失效。

group by关键字优化

  • group by实质是先排序后进行分组,遵照索引建的最佳左前缀
  • where高于having,能写在where限定的条件就不要去having限定了。
  • 当无法使用索引列,增大max_length_for_sort_data参数的设置+增大sort_buffer_size参数的设置
  • 尽量不要使用 distinct,可以考虑分组去重

MySQL索引

原文:https://www.cnblogs.com/-zzc/p/13618841.html

以上是 MySQL索引[数据库教程] 的全部内容, 来源链接: utcz.com/z/535214.html

回到顶部