全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

mysql中索引与FROM_UNIXTIME的问题

零、背景

这周四收到很多告警,找DBA看了看,发现有个慢查询。

简单收集一些信息后,发现这个慢查询问题隐藏的很深,问了好多人包括DBA都不知道原因。

一、问题

有一个DB, 有一个字段, 定义如下.

MySQL [d_union_stat]> desc t_local_cache_log_meta;
+----------------+--------------+------+-----+---------------------+
| Field     | Type     | Null | Key | Default       |
+----------------+--------------+------+-----+---------------------+
| c_id      | int(11)   | NO  | PRI | NULL        |
| c_key     | varchar(128) | NO  | MUL |           |
| c_time     | int(11)   | NO  | MUL | 0          |
| c_mtime    | varchar(45) | NO  | MUL | 0000-00-00 00:00:00 |
+----------------+--------------+------+-----+---------------------+
17 rows in set (0.01 sec)

索引如下:

MySQL [d_union_stat]> show index from t_local_cache_log_meta \G     
*************************** 1. row ***************************
    Table: t_local_cache_log_meta
  Non_unique: 0
   Key_name: PRIMARY
 Column_name: c_id
  Collation: A
 Cardinality: 6517096
  Index_type: BTREE
*************************** 2. row ***************************
.
.
.
*************************** 6. row ***************************
    Table: t_local_cache_log_meta
  Non_unique: 1
   Key_name: index_mtime
 Column_name: c_mtime
  Collation: A
 Cardinality: 592463
  Index_type: BTREE
6 rows in set (0.02 sec)

然后我写了一个SQL如下:

SELECT 
  count(*)
FROM
  d_union_stat.t_local_cache_log_meta
where
  `c_mtime` < FROM_UNIXTIME(1494485402);

终于有一天DBA过来了, 扔给我一个流水,说这个SQL是慢SQL。

# Time: 170518 11:31:14
# Query_time: 12.312329 Lock_time: 0.000061 Rows_sent: 0 Rows_examined: 5809647
SET timestamp=1495078274;
DELETE FROM `t_local_cache_log_meta` WHERE `c_mtime`< FROM_UNIXTIME(1494473461) limit 1000;

我顿时无语了,我的DB都是加了索引,SQL都是精心优化了的,怎么是慢SQL呢?

问为什么是慢SQL,DBA答不上来, 问了周围的同事也都答不上来。

我心里暗想遇到一个隐藏很深的知识点了。

令人怀疑的地方有两个:1.有6个索引。 2. 右值是 FROM_UNIXTIME 函数。

于是查询MYSQL官方文档,发现6个不是问题。

All storage engines support at least 16 indexes per table and a total index length of at least 256 bytes.  
Most storage engines have higher limits.

于是怀疑问题是 FROM_UNIXTIME 函数了。

然后看看MYSQL的INDEX小节,找到一点蛛丝马迹。

1.To find the rows matching a WHERE clause quickly.
2. To eliminate rows from consideration.
 If there is a choice between multiple indexes, MySQL normally uses the index that finds the smallest number of rows.
3.If the table has a multiple-column index, any leftmost prefix of the index can be used by the optimizer to look up rows.
4. MySQL can use indexes on columns more efficiently if they are declared as the same type and size.
 Comparison of dissimilar columns (comparing a string column to a temporal or numeric column, for example) may prevent use of indexes if values cannot be compared directly without conversion.

看到第4条的时候,提到不同类型可能导致不走索引,难道 FROM_UNIXTIME 的返回值不能转化为字符串类型?

于是查询 FROM_UNIXTIME 函数的返回值。

MySQL FROM_UNIXTIME() returns a date /datetime from a version of unix_timestamp.

返回的是一个时间类型,那强制转化为字符串类型呢?

MySQL [d_union_stat]> explain SELECT 
  ->   *
  -> FROM
  ->   t_local_cache_log_meta
  -> where
  ->   `c_mtime` = CONCAT(FROM_UNIXTIME(1494485402)) \G
*************************** 1. row ***************************
      id: 1
 select_type: SIMPLE
    table: t_local_cache_log_meta
     type: ref
possible_keys: index_mtime
     key: index_mtime
   key_len: 137
     ref: const
     rows: 1
    Extra: Using where
1 row in set (0.01 sec)

这次可以看到, 使用了索引,只扫描了一个数据。

二、结论

这次对 FROM_UNIXTIME 的返回值强制转化一下就可以利用上索引了。

所以这个SQL不能利用上索引是右值与左值的类型不一致导致的。 。

好了,不多说了, 这篇文章算是一个插曲,后面继续介绍算法吧。


# mysql  # from  # unixtime  # fromunixtime  # mysqlfrom  # Mysql索引性能优化问题解决方案  # MySQL批量插入和唯一索引问题的解决方法  # 分析Mysql表读写、索引等操作的sql语句效率优化问题  # 解决MySQL中IN子查询会导致无法使用索引问题  # mysql索引必须了解的几个重要问题  # 分析MySQL中索引引引发的CPU负载飙升的问题  # php mysql索引问题  # Mysql索引常见问题汇总  # 都是  # 返回值  # 问了  # 转化为  # 很深  # 有一个  # 的是  # 给我  # 好了  # 都不  # 有个  # 说了  # 不多  # 点了  # 看了看  # 也都  # 蛛丝马迹  # 可以看到  # 问题是  # 写了 


相关文章: 建站之星2.7模板:企业网站建设与h5定制设计专题  h5在线制作网站电脑版下载,h5网页制作软件?  建站之星后台密码遗忘如何找回?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  如何快速搭建响应式可视化网站?  如何在搬瓦工VPS快速搭建网站?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  ,购物网站怎么盈利呢?  如何选择适配移动端的WAP自助建站平台?  相册网站制作软件,图片上的网址怎么复制?  微信小程序 五星评分(包括半颗星评分)实例代码  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  c++怎么用jemalloc c++替换默认内存分配器【性能】  如何选择可靠的免备案建站服务器?  如何用PHP快速搭建CMS系统?  *服务器网站为何频现安全漏洞?  如何快速搭建FTP站点实现文件共享?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  太平洋网站制作公司,网络用语太平洋是什么意思?  建站主机与服务器功能差异如何区分?  香港服务器租用费用高吗?如何避免常见误区?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  如何快速建站并高效导出源代码?  网站制作需要会哪些技术,建立一个网站要花费多少?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  如何通过西部数码建站助手快速创建专业网站?  江苏网站制作公司有哪些,江苏书法考级官方网站?  建站之星代理平台如何选择最佳方案?  网站制作壁纸教程视频,电脑壁纸网站?  如何在云主机上快速搭建多站点网站?  如何在阿里云虚拟服务器快速搭建网站?  网站制作说明怎么写,简述网页设计的流程并说明原因?  如何快速上传建站程序避免常见错误?  建站之星24小时客服电话如何获取?  如何破解联通资金短缺导致的基站建设难题?  定制建站价位费用解析与套餐推荐全攻略  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  如何规划企业建站流程的关键步骤?  如何高效利用200m空间完成建站?  如何用AWS免费套餐快速搭建高效网站?  自助网站制作软件,个人如何自助建网站?  建站之星客服服务时间及联系方式如何?  焦点电影公司作品,电影焦点结局是什么?  公司门户网站制作流程,华为官网怎么做?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  网站网页制作专业公司,怎样制作自己的网页? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。