首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >2其中子句比分隔查询慢

2其中子句比分隔查询慢
EN

Stack Overflow用户
提问于 2019-02-27 14:50:19
回答 2查看 44关注 0票数 0

我正在使用Google (微服务器版本)运行一些性能测试。

我想执行以下查询:

代码语言:javascript
复制
select count(*) from table where A = valueA and B like "%input_string%";
+----------+
| count(*) |
+----------+
|   512997 |
+----------+
1 row in set (9.64 sec)

如果我把它们分开运行,我会得到:

代码语言:javascript
复制
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应用程序中排序表。

谢谢!编辑:表模式

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-27 15:31:00

一个选项可能是使用FULLTEXT INDEX并在其上使用MATCH()

代码语言:javascript
复制
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

和查询重写

代码语言:javascript
复制
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语句。

一般的想法是得到两个过滤器的两个计数,并选择最低的作为有效计数。

查询

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2019-03-07 23:07:16

你每次都跑两次吗?如果没有,可能会涉及缓存,使您感到困惑。

where A = valueA and B like "%input_string%";恳求INDEX(A, B)。注意:该复合索引不等同于两个单独的索引。

如果您在B上使用了一个B索引,那么这将更简单:

代码语言:javascript
复制
SELECT COUNT(*) FROM t
    WHERE MATCH(B) AGAINST('+input_string' IN BOOLEAN MODE)
      AND A = valueA

(子查询的使用应该是不必要的,速度应该更慢。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54908133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档