当前位置: 首页 > news >正文

【转】mysql的cardinality异常,导致索引不可用

 转自:http://ourmysql.com/archives/1343

   前段时间,一大早上,就收到报警,警告php-fpm进程的数量超过阈值。最终发现是一条sql没用到索引,导致执行数据库查询慢了,最终导致php-fpm进程数增加。最终通过analyze table feed_comment_info_id_0000 命令更新了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 查看其值

相关文章:

  • jquery如何判断滚动条滚到页面底部并执行事件
  • ios 用户相册
  • [android] 练习PopupWindow实现对话框
  • %@ page import=%的用法
  • Windows平台下Git服务器搭建
  • Matlab 读取excel文件提示服务器出现意外情况或无法读取问题解决
  • mysql 配置参考
  • 对集合中的对象进行排序,用collections.sort 到方法
  • jquery 遍历表格,需要表格中每个td的内容
  • Linux GPRS模块问题
  • Linux 学习之路
  • 每天一个linux命令(4):mkdir命令
  • UVA725 UVALive5362 Division
  • CentOS下搭建cacti监控
  • 分享磨砺营马剑威讲解-Android N中对java 8的支持
  • 【Leetcode】104. 二叉树的最大深度
  • jdbc就是这么简单
  • js如何打印object对象
  • linux安装openssl、swoole等扩展的具体步骤
  • PAT A1017 优先队列
  • Protobuf3语言指南
  • QQ浏览器x5内核的兼容性问题
  • React as a UI Runtime(五、列表)
  • 程序员该如何有效的找工作?
  • 读懂package.json -- 依赖管理
  • 对超线程几个不同角度的解释
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 使用SAX解析XML
  • 微信支付JSAPI,实测!终极方案
  • 一道闭包题引发的思考
  • Android开发者必备:推荐一款助力开发的开源APP
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • # Panda3d 碰撞检测系统介绍
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (1) caustics\
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (汇总)os模块以及shutil模块对文件的操作
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)memcache、redis缓存
  • (转)Sql Server 保留几位小数的两种做法
  • .a文件和.so文件
  • .net 设置默认首页
  • .Net环境下的缓存技术介绍
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @Documented注解的作用
  • [1] 平面(Plane)图形的生成算法
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [4.9福建四校联考]
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [Deepin 15] 编译安装 MySQL-5.6.35
  • [Everyday Mathematics]20150130
  • [Java算法分析与设计]--线性结构与顺序表(List)的实现应用