Décrire:mysql requête lent pour peu de données mis
Le tableau profit
a environ 20 colonnes, et aucune grande colonne comme text
, et ont deux indexs:
- index
idx_uid
sur la colonneuid
- index
uid_acc_fId_date
sur la colonneuid,acc,fid and date
La requête SQL lente est:
select * from profit where (((uid='1111') and (flag=32)) and (fId='2222')) and (date='20161008') limit 1;
et expliquer la sortie est:
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
Execute SQL avec sql_no_cache
passera environ 2 s, et exécuter le même sql avec sql_no_cache
deuxième fois dépenser environ 0,1s.
Env:
- mysql 5.5.49-37.9, InnoDB, Percona
- SATA HDD
- Le bénéfice de table a environ un million de lignes
- Centos 2.6 noyau
- lignes compte pour
uid=1111
est seulement
PS:
Mysql sera tous les jours de sauvegarde à minuit, et innodb_old_blocks_time
est 0, je pense que la sauvegarde videra toutes les données de tampon chaud pool.But même il passe trop de temps pour faire la ci-dessus query.So, est-ce le problème de disque
Combien de lignes sont trouvées si vous supprimez 'flag = 32'? Parce que pour 'flag' vous n'avez pas spécifié d'index, mysql a besoin de toutes les lignes ayant' uid = '1111' et fId = '2222' et date = '20161008'' et ensuite vérifie chacune d'elles si le 'drapeau 'est' 32'. –
Merci pour votre temps. Et toutes les lignes de données pour 'uid = 1111' ont seulement 270 lignes –
S'il vous plaît fournir' SHOW CREATE TABLE'. –