我正在使用Google (微服务器版本)运行一些性能测试。
我想执行以下查询:
select count(*) from table where A = valueA and B like "%input_string%";
+----------+
| count(*) |
+----------+
| 512997 |
+----------+
1 row in set (9.64 sec)如果我把它们分开运行,我会得到:
select count(*) from table where A = valueA;
+----------+
| count(*) |
+----------+
| 512998 |
+----------+
1 row in set (0.18 sec)
select count(*) from table where B like "%input_string%";
+----------+
| count(*) |
+----------+
| 512997 |
+----------+
1 row in set (1.43 sec)这在性能上有什么不同?
A列和B列都有索引,因为它们用于在web应用程序中排序表。
谢谢!编辑:表模式
table | CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`A` varchar(9) DEFAULT NULL,
`B` varchar(50) DEFAULT NULL,
`C` varchar(10) DEFAULT NULL,
`D` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `A` (`A`),
KEY `B` (`B`)
) ENGINE=InnoDB AUTO_INCREMENT=512999 DEFAULT CHARSET=utf8发布于 2019-02-27 15:31:00
一个选项可能是使用FULLTEXT INDEX并在其上使用MATCH()。
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`A` varchar(9) DEFAULT NULL,
`B` varchar(50) DEFAULT NULL,
`C` varchar(10) DEFAULT NULL,
`D` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY(A),
FULLTEXT INDEX(B)
) ENGINE=InnoDB AUTO_INCREMENT=512999 DEFAULT CHARSET=utf8和查询重写
SELECT
count(*)
FROM
`table`
WHERE
A = 'A'
AND
B IN (
SELECT
B
FROM
`table`
WHERE
MATCH(B) AGAINST('+input_string' IN BOOLEAN MODE)
)内部SQL将根据全文索引过滤可能的结果。
外部SQL将执行另一个筛选。
你也可以用一个UNION ALL,现在我想一想。
它应该可以处理这个问题,CREATE TABLE语句。
一般的想法是得到两个过滤器的两个计数,并选择最低的作为有效计数。
查询
SELECT
MIN(counted) AS 'COUNT(*)' # Result 512997
FROM (
select count(*) AS counted from `table` where A = 'A' # Result 512998
UNION ALL
select count(*) from `table` where B like "%input_string%" # Result 512997
) AS counts发布于 2019-03-07 23:07:16
你每次都跑两次吗?如果没有,可能会涉及缓存,使您感到困惑。
where A = valueA and B like "%input_string%";恳求INDEX(A, B)。注意:该复合索引不等同于两个单独的索引。
如果您在B上使用了一个B索引,那么这将更简单:
SELECT COUNT(*) FROM t
WHERE MATCH(B) AGAINST('+input_string' IN BOOLEAN MODE)
AND A = valueA(子查询的使用应该是不必要的,速度应该更慢。)
https://stackoverflow.com/questions/54908133
复制相似问题