mysql - 优化大型表上的 SQL 查询

标签 mysql sql optimization

首先,这个问题是关于MySQL 3.23.58的,所以请注意。

我有 2 个表,定义如下:

Table A: id INT (primary), customer_id INT, offlineid INT

Table B: id INT (primary), name VARCHAR(255)

现在,表 A 包含 65k+ 条记录,而表 B 包含约 40 条记录。除了2个主键索引外,A表的offlineid字段上还有一个索引,每个表的字段比较多,但不相关(我看是这样的,请问是不是必要的)对于这个查询。

我首先收到以下查询(查询时间:~22 秒):

SELECT b.name, COUNT(*) AS orders, COUNT(DISTINCT(a.kundeid)) AS leads
FROM katalogbestilling_katalog a, medie b
WHERE a.offlineid = b.id
GROUP BY b.name

现在,medie 中的每个 id 都与不同的名称相关联,这意味着您可以按 id 和名称进行分组。一些来回测试使我确定了这一点(查询时间:~6 秒):

SELECT a.name, COUNT(*) AS orders, COUNT(DISTINCT(b.kundeid)) AS leads
FROM medie a
INNER JOIN katalogbestilling_katalog b ON a.id = b.offline
GROUP BY b.offline;

有什么方法可以将它调低到“即时”时间(最坏情况下最多 1 秒)?我在 offlineid 上添加了索引,但除此之外以及查询的重新安排,我不知道该做什么。 EXPLAIN 查询显示查询正在使用 fileshort(原始查询也使用临时表)。欢迎所有建议!

最佳答案

我猜你的主要问题是你使用的是这么旧版本的 MySQL。也许 MySQL 3 不喜欢 COUNT(DISTINCT())。

或者,它可能只是系统性能。你有多少内存?

不过,MySQL 3 确实很旧。我至少会组装一个测试系统,看看新版本是否能更快地运行该查询。

关于mysql - 优化大型表上的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/114284/

相关文章:

mysql - 从具有某些条件的两个相同表中获取记录

mysql - mysql 中主键的重复条目

php - 如何使用group by得到多个结果集?在多列上分组

algorithm - 计算二维数组中 block 组的总数?

c++ - 为什么这个 OpenMP 程序比单线程程序慢?

php - 用户 'root' @'localhost' 的访问被拒绝(使用密码 : YES) using ssh tunnel connection

java - 使用外键关联的一对一映射 hibernate

sql - 如何防止coldfusion sql-injection on order by子句

SQL Server Sum Aggregate 函数 - 过滤结果集?

mysql - 优化SQL查询(类似Facebook的应用程序)