开发篇之索引的设计和使用

索引的设计和使用

索引用于快速找出某个列中有一特定值的行

索引概述

  • 使用索引可以提高select的性能
  • 根据存储引擎可以定义每个表的最大索引书和最大索引长度
  • MyISAM和InnoDB存储引擎的表默认创建的都是BTREE索引
  • MySQL目前不支持函数索引,但支持前缀索引
  • MySQL支持全文本索引,该索引可以用于全文搜索,5.0版本的MySQL只有MyISAM存储引擎支持全文索引,并且只限于CHAR、VARCHAR、TEXT列
  • 索引总是对整个列进行,不支持局部索引

创建索引

create [unique|fulltext|spatial] index index_name
[using index_type]
on table_name(index_col_name)

index_col_name:col_name[(length)][ASC|DESC]

举例:为my表创建3个字节的前缀索引

create index myname on my(name(3));

查看索引使用:explain select * from my where name='yyy';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JX3SdgDZ-1583721764978)(./picture/1.png)]

删除索引

drop index index_name on table_name;

设计索引原则

  • 适合索引的列是出现在WHERE子句中的列,或连接子句中指定的列,不是select关键字后的选择列表中的列
  • 使用唯一索引,即列内保存的值具有不同值,容易区分
  • 使用短索引
  • 利用最左前缀
  • 不要过度索引,每个额外的索引都要占用额外的磁盘空间,降低写操作的性能
  • InnoDB会默认按照一定的顺序保存,如果由明确定义的主键,就按主键顺序保存,如果没有,就按照唯一索引保存,如果两个都没有就会自动生成一个内部列,尽量自己指定主键,其普通索引也会保存主键的键值,主键要尽量短

BTREE 索引和HASH索引

MEMORY存储引擎的表可以选择使用BTREE索引或者HASH索引

HASH索引

特征

  • 只用于使用=或<=>操作符的等式比较
  • 优化器不能使用HASH索引来加速ORDER BY操作
  • MySQL不能确定再两个值之间大约有多少行。如果将一个MyISAM表改为HASH索引的MEMORY表,会影响一些查询的执行效率
  • 只能使用整个关键字来搜索一行

BTREE索引

特征

  • 当使用>,<,<=,>=,between,!=或<>或like操作符时,都可以使用相关列上的索引

一些情况

  • 适用于BTREE和HASH

select * from t1 where key_col = 1 or key_col in (15,18,20);

  • 只适用于BTREE

select * from t1 where key_col >1 and key_col<10;

  • 只适用于BTREE

select * from t1 where key_col >1 and key_col<10;

  • 当对索引字段进行范围查询时,只有BTREE索引可以通过索引访问,而HASH索引实际上是全表扫描
发布了28 篇原创文章 · 获赞 1 · 访问量 1710

猜你喜欢

转载自blog.csdn.net/doordiev/article/details/104747523
今日推荐