J'utilise MySQL 5.6.19-log (selon select version()
).Comment forcer MySQL "Utiliser l'index pour le groupe par"
J'ai une table InnoDB quelque chose comme ceci:
CREATE TABLE `mytable` (
`foo_id` bigint(20) NOT NULL,
`bar_id` bigint(20) NOT NULL,
`baz_id` bigint(20) NOT NULL,
PRIMARY KEY (`foo_id`,`bar_id`,`baz_id`)
)
Ce tableau fonctionne bien avec la requête suivante:
select
foo_id,
min(bar_id)-1
from
mytable
where
foo_id IN (
1000,2000
)
group by
foo_id;
+----+-------------+----------------------+-------+------------------------+---------+---------+------+-------+---------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------------------+-------+------------------------+---------+---------+------+-------+---------------------------------------+
| 1 | SIMPLE | mytable | range | PRIMARY,bar_id_idx | PRIMARY | 8 | NULL | 58245 | Using where; Using index for group-by |
+----+-------------+----------------------+-------+------------------------+---------+---------+------+-------+---------------------------------------+
+----------+------------+-----------------------------------------------------------------------------------------------------------------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+-----------------------------------------------------------------------------------------------------------------------------------------------+
| 1 | 0.00036575 | select foo_id, min(bar_id)-1 from mytable where foo_id IN (1000,2000) group by foo_id |
+----------+------------+-----------------------------------------------------------------------------------------------------------------------------------------------+
Mais, lorsque le nombre de foo_id
dans la clause where est une seule , la requête devient assez lente, comme suit:
select
foo_id,
min(bar_id)-1
from
mytable
where
foo_id = 1000
group by
foo_id;
+----+-------------+----------------------+------+------------------------+---------+---------+-------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------------------+------+------------------------+---------+---------+-------+--------+-------------+
| 1 | SIMPLE | mytable | ref | PRIMARY,bar_id_idx | PRIMARY | 8 | const | 873664 | Using index |
+----+-------------+----------------------+------+------------------------+---------+---------+-------+--------+-------------+
+----------+------------+-----------------------------------------------------------------------------------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+-----------------------------------------------------------------------------------------------------------------+
| 1 | 0.07258075 | select foo_id, min(bar_id)-1 from mytable where foo_id = 1000 group by foo_id |
+----------+------------+-----------------------------------------------------------------------------------------------------------------+
Je pense que quelque chose wen t mal avec le planificateur de requêtes de MySQL. Y at-il un indice ou quelque chose pour forcer MySQL à utiliser l'index pour le groupe, alors que le nombre de foo_id
est seulement un? J'ai essayé analyze table mytable
mais cela n'aide pas.
Je sais qu'une requête select min(bar_id)-1 from mytable where foo_id = 1000
est rapide quand le nombre de foo_id
est seulement un, mais il fait une branche au code de mon application, donc je voudrais éviter cela.
Est-il utile si vous'Où foo_id en (1000) '? – shmosel
Malheureusement, ce n'est pas le cas. Il produit exactement le même plan de requête et la même performance à 'where foo_id = 1000' –
Que faire si vous supprimez le' group by'? – shmosel