mysql的cardinality异常,导致索引不可用
排查过程如下:
sql语句:
select id from feed_comment_info_id_0000 where obj_id=101 and type=1;
索引信息:
show index from feed_comment_info_id_0000 +---------------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | +---------------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | feed_comment_info_id_0000 | 0 | PRIMARY | 1 | id | A | 6216 | NULL | NULL | | BTREE | | | feed_comment_info_id_0000 | 1 | obj_type | 1 | obj_id | A | 6216 | NULL | NULL | | BTREE | | | feed_comment_info_id_0000 | 1 | obj_type | 2 | type | A | 6216 | NULL | NULL | YES | BTREE | | | feed_comment_info_id_0000 | 1 | user_id | 1 | user_id | A | 6216 | NULL | NULL | | BTREE | | +---------------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 5 rows in set (0.00 sec)
通过explian查看时,发现sql用的是主键PRIMARY,而不是obj_type索引。通过show index 查看索引的Cardinality值,发现这个值是实际数据的两倍。感觉这个Cardinality值已经不正常,因此通过analyzea table命令对这个值从新进行了计算。命令执行完毕后,就可用使用索引了。
Cardinality解释
官方文档的解释:
An estimate of the number of unique values in the index. This is updated by running ANALYZE TABLE or myisamchk -a. Cardinality is counted based on statistics stored as integers, so the value is not necessarily exact even for small tables. The higher the cardinality, the greater the chance that MySQL uses the index when doing
总结一下:
1、它代表的是索引中唯一值的数目的估计值。如果是myisam引擎,这个值是一个准确的值。如果是innodb引擎,这个值是一个估算的值,每次执行show index 时,可能会不一样
2、创建Index时(primary key除外),MyISAM的表Cardinality的值为null,InnoDB的表Cardinality的值大概为行数;
3、值的大小会影响到索引的选择
4、创建Index时,MyISAM的表Cardinality的值为null,InnoDB的表Cardinality的值大概为行数。
5、可以通过Analyze table来更新一张表或者mysqlcheck -Aa来进行更新整个数据库
6、可以通过 show index 查看其值
【MySQL】索引 哈喽,大家好~我是保护小周ღ,本期为大家带来的是 MySQL 数据库中表的索引,详细得讲解了索引得基本概念,使用场景,如何添加索引,删除索引,展示索引,以及索引背后的数据结构,确定不来看看~ 更多相关知识敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★*
MySQL详解:索引的介绍和原理分析 MySQL官方对索引的定义为:索引(Index)是协助MySQL高效获取数据的数据结构。 本质上,索引的目的是为了提高查询效率,通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。
相关文章
- mysql查询表的索引_MySQL查看表索引[通俗易懂]
- MySQL数据库如何进行索引更改(mysql更改索引)
- 管理MySQL状态管理:实现对数据库的高效管理(mysql状态)
- MySQL排序:升序与降序的比较(mysql升降序)
- MySQL添加索引:轻松实现优化查询(mysql添加索引语句)
- 什么MySQL添加索引的实现方法探究(mysql添加索引命令是)
- MySQL中联合索引优化数据访问性能(mysql联合索引)
- Mysql索引创建基于语法的指南(mysql创建索引语法)
- MySQL轻松在线增加索引操作,提升数据库查询效率(mysql在线建索引)
- PHP如何关闭MySQL数据库连接(php关闭mysql连接)
- 如何删除MySQL中的存储过程(删除mysql存储过程)
- Mysql中如何追加更多的索引(mysql追加索引)
- MySQL 性能优化实践研讨PPT(mysql优化ppt)
- 深入浅出MySQL索引搜索技巧(mysql索引搜索)
- 命令行下创建MySQL数据库的指南(命令创建mysql数据库)
- MySQL的源码安装指南(mysql源码安装)
- MySQL存储过程备份:有备无患(mysql存储过程备份)
- MySQL中替代代码的方法(mysql中代码替换)
- MySQL主键索引语法及作用解析(mysql中主键索引语法)
- C语言如何优雅安全地保存MySQL数据库(c 保存mysql数据库)
- MySQL 索引优化探究 BTree 索引原理及应用(mysql中btree)
- 数据库备份Cmd下MySQL数据库备份简单而快速的方式(cmd命令下mysql)
- MySQL三级索引优化查询速度(mysql三级索引)
- MySQL同步异常,疑似数据不一致,及时报警(mysql不同步了 报警)
- 不索引MySQL,更快速度(mysql不要索引还更快)
- 解决MySQL切换用户问题的方法及注意事项(mysql不能切换用户)