【发布时间】:2016-10-09 07:02:47
【问题描述】:
描述:
表profit大约有20列,没有text这样的大列,并且有两个索引:
- 索引
idx_uid在列uid - 索引
uid_acc_fId_date在列uid,acc,fid and date
慢查询sql为:
select * from profit where (((uid='1111') and (flag=32)) and (fId='2222')) and (date='20161008') limit 1;
解释输出为:
id:1
select_type:SIMPLE
table:profit
type:ref
possible_keys:uid_acc_fId_date
key:uid_acc_fId_date
key_len:4
ref:const
rows:267
Extra:Using where
执行sql_no_cache的sql大约需要2s,第二次使用sql_no_cache执行同样的sql大约需要0.1s。
环境:
- mysql 5.5.49-37.9,innodb,percona
- SATA 硬盘
- 表利润大约有一百万行
- Centos 2.6 内核
-
uid=1111的行数仅为 270
PS:
Mysql每天半夜都会备份,而innodb_old_blocks_time是0,我觉得备份会把所有热点数据都冲出缓冲池。但即便如此,上面的查询还是花费了太多时间。所以,是磁盘问题吗?
【问题讨论】:
-
如果删除
flag=32,会找到多少行?因为对于flag,您没有指定索引,所以mysql需要获取所有具有uid='1111' and fId='2222' and date='20161008'的行,然后检查flag是否为32。 -
感谢您的宝贵时间。而
uid=1111的所有数据行只有 270 行 -
请提供
SHOW CREATE TABLE。 -
系统迁移到AWS后解决。。。
标签: mysql innodb mysql-slow-query-log