mysql慢查询小数据集

时间:2016-10-09 07:02:47

标签: mysql innodb mysql-slow-query-log

说明:

profit包含大约20列,没有像text这样的大列,并且有两个索引:

    idx_uid 上的
  1. 索引uiduid_acc_fId_date
  2. 上的
  3. 索引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。

    ENV:

    1. mysql 5.5.49-37.9,innodb,percona
    2. SATA HDD
    3. 表利润大约有一百万行
    4. Centos 2.6内核
    5. uid=1111的行数仅为 270
    6. PS:

      Mysql将在午夜每天备份,innodb_old_blocks_time为0,我认为备份会将所有热数据刷新到缓冲池之外。但即使如此,它也会花费太多时间来执行上述查询。那么,这是磁盘问题吗?

3 个答案:

答案 0 :(得分:1)

扩展上述评论,将索引uid_acc_fId_date更改为(uid,fid,date,acc)并将查询更改为:

SELECT columns
     , I
     , actually
     , want
  FROM profit 
 WHERE uid = 1111 
   AND fId = 2222
   AND date='20161008'
   AND flag = 32
 ORDER 
    BY uid
 LIMIT 1;

答案 1 :(得分:0)

尝试选择查询时始终使用列名。与SELECT name,table_name中的class_name;

类似

答案 2 :(得分:0)

尝试删除where条件中的所有括号。不必要的括号导致mysql无法正确使用索引。

select * 
from profit 
where 
     uid='1111' 
     and flag=32 
     and fId='2222' 
     and date='20161008' 
limit 1;