SQL查询使用like vs group by aggregation function - performance

时间:2014-06-18 13:07:44

标签: mysql performance

我正在尝试为每个应用程序(SRC)获取第一个app_id条目。

图片表有2列(app_idsrc)。

两种解决方案:   - 使用MIN。   - 使用LIKE

我有以下两个查询,我想知道哪个执行速度更快或它们是否相同?

我应该使用不同的指标或功能吗?

查询

MIN BY GROUP BY

EXPLAIN
SELECT app_id,
       min(src)
FROM image
GROUP BY app_id ;

LIKE

EXPLAIN
SELECT app_id,
       i.src
FROM image i
WHERE i.src LIKE '%.0.jpg';

结果:

mysql> EXPLAIN select app_id, min(src) from image group by app_id limit   100000;
+----+-------------+-------+-------+---------------+-----------------------------+---------+------+-------+-------------+
| id | select_type | table | type  | possible_keys | key                         | key_len | ref  | rows  | Extra       |
+----+-------------+-------+-------+---------------+-----------------------------+---------+------+-------+-------------+
|  1 | SIMPLE      | image | index | NULL          | FK_x2mlprm4ootu8u253f7sd9rs | 768     | NULL | 52532 | Using index |
+----+-------------+-------+-------+---------------+-----------------------------+---------+------+-------+-------------+
1 row in set (0.00 sec)

mysql> EXPLAIN select app_id, i.src from image i where i.src like '%.0.jpg' limit 100000;
+----+-------------+-------+-------+---------------+-----------------------------+---------+------+-------+--------------------------+
| id | select_type | table | type  | possible_keys | key                         | key_len | ref  | rows  | Extra                    |
+----+-------------+-------+-------+---------------+-----------------------------+---------+------+-------+--------------------------+
|  1 | SIMPLE      | i     | index | NULL          | FK_x2mlprm4ootu8u253f7sd9rs | 768     | NULL | 52532 | Using where; Using index |
+----+-------------+-------+-------+---------------+-----------------------------+---------+------+-------+--------------------------+
1 row in set (0.00 sec)

澄清

  • 存储的数据和结构使得两个查询产生相同的结果。
  • min(src)将始终返回LIKE '%.0.jpg'
  • 的方式存储数据(来自应用程序逻辑)
  • .0.jpg是每个应用可以存在的最小src,因为.0.jpg之前的所有内容对于属于同一app的条目都是相同的。
  • 请假设(并说明何时)将以最佳方式索引列。可以对表格进行更改。

1 个答案:

答案 0 :(得分:1)

GROUP BY查询应该是最快的查询,因为它主要基于索引,而LIKE查询仅部分使用索引(如EXPLAIN所示,其中它说Using where; Using index),肯定不是i.src like '%.0.jpg'部分。

MySQL Reference Manual中报告了以下内容:

  

如果参数为,则索引也可以用于LIKE比较   LIKE是一个不以通配符开头的常量字符串   字符。例如,以下SELECT语句使用索引:

SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';

因为在你的情况下,参数以通配符开头,所以它不会使用索引,因此查询应该更慢。