使用索引查询一定能提高查询的性能吗?为什么? mysql问题(二)

使用索引查询不一定能提高查询的性能

  1. Cardinality 索引基数

索引基数简单的说就是:你索引列的唯一值的个数,如果是复合索引就是唯一组合的个数。这个数值将会作为MySQL优化器对语句执行计划进行判定时依据。如果唯一性太小,那么优化器会认为这个索引对语句没有太大帮助,而不使用索引。cardinality值越大,就意味着,使用索引能排除越多的数据,执行也更为高效。

有时候记录更新,但索引基数没有更新,需要使用analyzetable更新索引基数。

analyze local table 表名

ps:当MySQL数据库做FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, or OPTIMIZE TABLE这些操作时,会导致需要关闭内存中的表,并重新打开表,加载新的表结构到内存中。但是关闭表,需要等待所有的在这个表上的操作执行结束(包括select,insert,update,lock table等),所以当有一个特别慢的select一直在执行时,analyze table命令就一直无法结束。

显示Cardinality 索引基数

show index from 表

如下图所示
在这里插入图片描述

  1. 联合索引及最左原则
    假设A、B、C三个字段索引按A+B+C顺序创建的索引:

查询时候带字段
A --走索引

B --不走索引

C --不走索引

A + B 或 B + A – 走索引

B + C 或 C + B – 不走索引

A + B + C 或 B + C + A 或 C + B + A --走索引

显示查询语句使用的索引

explain  select * from  表  where 字段

或者

SHOW INDEX FROM;
  1. possible_keys 可能使用的索引,注意不一定会使用。查询涉及到的字段上若存在索引,则该索引将被列出来。当该列为 NULL时就要考虑当前的SQL是否需要优化了。
  2. key 显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL。
    TIPS:查询中若使用了覆盖索引(覆盖索引:索引的数据覆盖了需要查询的所有数据),则该索引仅出现在key列表中
  3. key_length 索引长度
  4. ref 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
  5. rows 返回估算的结果集数目,并不是一个准确的值。

如下图所示,假设available不设置索引,id为主键
走主键索引 id
使用索引查询一定能提高查询的性能吗?为什么? mysql问题(二)_第1张图片

3. 查询语句写法问题

  • 使用LIKE关键字的查询
    如果匹配字符的第一字符使用的%,索引不会起作用,只有第一个字符不是字符 %时,索引才会起作用

  • 带有or的查询
    只有or前后的两个条件中的列都是索引时,查询中才使用索引。

通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价.

索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改. 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O. 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能,
索引范围查询(INDEX RANGE SCAN)适用于两种情况:

基于一个范围的检索,一般查询返回结果集小于表中记录数的30%宜采用;

基于非唯一性索引的检索

索引就是为了提高查询性能而存在的,如果在查询中索引没有提高性能,只能说是用错了索引,或者讲是场合不同

你可能感兴趣的:(mysql,mysql,数据库,sql,索引,1024程序员节)