【发布时间】:2017-03-17 19:02:13
【问题描述】:
我正在将 PHP 应用程序从 MSSQL Server 迁移到 MySQL,但我遇到了一个简单的查询,MSSQL Server 持续 0.5 秒,MySQL 持续 50 秒。有任何想法吗?索引?服务器配置? MySQL 服务器硬件等于或优于 MSSQL 服务器。
表结构
两者都是 InnoDB:
CREATE TABLE `tb1` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`nec` INT(11),
`start_date` DATETIME(6) NOT NULL,
`end_date` DATETIME(6) NOT NULL,
PRIMARY KEY (`id`),
INDEX `IX_nec` (`nec`)
);
CREATE TABLE `tb2` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`nec` INT(11) NOT NULL,
`start_date` DATETIME(6) NOT NULL,
`end_date` DATETIME(6) NOT NULL,
PRIMARY KEY (`id`),
INDEX `IX_nec` (`nec`)
);
这些表很大。 Tb1 大约有 300.000 行,tb2 大约有 400.000 行。
选择
SELECT count(1)
FROM tb2
LEFT JOIN tb1 ON tb1.nec = tb2.nec
结果大约是 180.000.000。
这只是一个示例,最终目标是使用其他日期过滤器/交叉点等进行更大的查询。
配置、硬件……
@@innodb_buffer_pool_size: 2147483648
选择版本():5.7.17-0ubuntu0.16.04.1
Profiling of the query(CSV 文件)
Procedure Analyse()(XLS 文件)
my.cnf
系统:
VMware 虚拟平台
Intel(R) Xeon(R) CPU E5530 @ 2.40GHz
4GiB DIMM DRAM EDO
Ubuntu 16.04.2 LTS(Linux gt 4.4.0-66-generic x86_64)
【问题讨论】:
-
慰问。我了解想要获得更便宜或开放的数据库,但这些天是 Postgresql,而不是 MySql。自 2004 年以来,MySql 一直没有跟上 Sql Server、Oracle 和 Postgresql 的进步。它甚至不再是一个现代数据库引擎:没有 CTE(递归或其他)、没有窗口函数、没有横向连接/应用、没有完全连接等等。
-
可能是内存问题 用
SELECT @@innodb_buffer_pool_size;编辑您的问题并添加解释计划 -
我敢打赌,如果您使用
INNER JOIN而不是LEFT JOIN,它会快得多。您是否需要计算tb2中与tb1中没有任何匹配的行? -
嗯...这不是默认的 128MB,但对于真正的数据库服务器来说,2GB 似乎仍然很小。理想情况下,您需要足够的空间来将所有表和索引一直保存在内存中(尽管不能这样做很常见)。相比之下,我现在正在使用的 Sql Server 的缓冲池等效值超过 16GB,而按照现代标准,这仍然很小。
-
@Mihai 发布@@innodb_buffer_pool_size 并说明计划
标签: mysql performance join