mysql - 2 where 子句比分离查询慢
问题描述
我正在使用 Google Cloud SQL(微型服务器版本)运行几个性能测试。
我想做以下查询:
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
解决方案
一个选项可能正在使用 aFULLTEXT 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 将根据 FULLTEXT 索引过滤掉可能的结果。
而外部 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
推荐阅读
- reactjs - React-Native Firebase 部署错误命令 Cli
- python - python的隶属函数是如何工作的?
- wpf - Ranorex 找不到 WPF Expander 的自动化 ID
- javascript - 试图将一个小的 javascript 代码转换为 java
- laravel - Laravel 加载助手不会自动
- c# - 在 4.5.11 版中忽略了 web.config 或 app.config 中的 NLog 配置
- python - 将 Recaptcha 表单添加到我的 Django 登录页面
- ruby-on-rails - 有谁知道用于 SQL Server 的 Rails 数据库适配器,它使用 ODBC 驱动程序并且也应该在 rails 5.0 上工作?
- java - 如何调用基类方法
- reactjs - 使用 React Context 时避免重复