gpt4 book ai didi

php - 为什么这个 MySQL 查询在添加更多条件时会变慢?

转载 作者:行者123 更新时间:2023-11-30 22:05:28 31 4
gpt4 key购买 nike

所以我有两个表:

1

CREATE TABLE `adstable` (
`adid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`adbudget` decimal(14,7) unsigned NOT NULL DEFAULT '0.0000000',
`targetdesktop` tinyint(1) NOT NULL DEFAULT '1',
`adactive` tinyint(1) NOT NULL,
`user` bigint(20) unsigned NOT NULL,
`approved` tinyint(1) NOT NULL,
`imp_today` int(10) unsigned NOT NULL DEFAULT '0',
`targetwindows` tinyint(1) NOT NULL,
PRIMARY KEY (`adid`),
KEY `user_index` (`user`),
KEY `budget_index` (`adbudget`) USING BTREE,
KEY `imp_today_index` (`imp_today`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=719102 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT

2

CREATE TABLE `userstable` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`balance` decimal(14,7) unsigned NOT NULL DEFAULT '0.0000000',
PRIMARY KEY (`id`),
KEY `balance_index` (`balance`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT

我有两个 MySQL 查询:

1

SELECT adstable.adid FROM adstable INNER JOIN userstable ON (adstable.user = userstable.id  ) 
WHERE
adstable.adactive=1 AND adstable.approved = 1 AND
adstable.targetdesktop = 1 AND adstable.targetwindows = 1 and
adstable.adbudget > 0.02 AND userstable.balance > 0.02
ORDER BY adstable.imp_today ASC limit 1

2

SELECT adstable.adid FROM adstable INNER JOIN userstable ON (adstable.user = userstable.id  ) 
WHERE
adstable.adactive=1 AND adstable.approved = 1 AND
adstable.adbudget > 0.02 AND userstable.balance > 0.02
ORDER BY adstable.imp_today ASC limit 1

第一个查询在 where 子句中有一个额外的条件:adstable.targetdesktop = 1 AND adstable.targetwindows = 1

但是我不明白的是为什么第一个查询需要 2-3 秒才能运行,而第二个查询需要 2-3 秒。

注意事项:

  • adstable 有大约 70 万行
  • 第二个和第一个查询都返回相同的两行(但额外的第一个查询中的条件使它慢得多)
  • 我通过删除 adstable.adactive=1 AND adstable.approved 来运行查询 1= 1 而不是 adstable.targetdesktop = 1 AND adstable.targetwindows = 1,查询在 0.001 秒内运行。

有谁知道为什么第二个查询比第一个查询快得多,即使第二个查询返回与第一个查询相同的#和行类型?

最佳答案

您没有发布 EXPLAIN 的输出,所以这是猜测。但是您的第一个查询的条件似乎有可能以某种方式迫使 MySQL 的查询规划器对您的 adstable 进行全表扫描。这不是一张小 table ,所以扫描需要一段时间。

尝试在该表的 (adactive, approved, adbudget, user) 上创建复合索引。这是您查询的覆盖索引。您应该阅读覆盖索引。

 ALTER TABLE adactive 
ADD INDEX act_appr_bud_user (adactive, approved, adbudget, user);

这应该允许查询规划器随机访问和部分扫描索引以满足您的查询。它可能会加快速度。

注意(截至 2017 年初)MySQL 的查询规划器通常只能使用每个表的一个索引来满足查询。因此,单列上的大量索引无法像为特定查询选择的复合索引那样提供帮助。

关于php - 为什么这个 MySQL 查询在添加更多条件时会变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41921606/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com