【发布时间】:2022-10-01 00:22:47
【问题描述】:
我有一个“简单”查询,使用 MariaDB 执行需要 0.7678 秒或更长时间。
这是查询:
select `referenceNumber`
from `invoice`
where `groupId` = 3550
and `referenceNumber` >= 301
order by `referenceNumber` desc
limit 1;
这些列有一个索引:\"referenceNumber\", \"groupId\"
我通过创建这样的子查询找到了解决方案:
select `referenceNumber`
from (
SELECT id
from `invoice`
where `groupId` = 3550
and `referenceNumber` >= 301
) as subquery
JOIN invoice as invoice ON invoice.id = subquery.id
order by `referenceNumber` desc
limit 1;
此查询大约需要 0.0011 秒。
您对第一个查询的性能不佳有解释吗?
两个令人惊讶的发现:
没有where `groupId` = 3550 的查询只需要 0.0005 秒,如下所示:
select `referenceNumber`
from `invoice`
where `referenceNumber` >= 301
order by `referenceNumber` desc
limit 1;
没有order by `referenceNumber` desc 的查询只需要 0.0011 秒,如下所示:
select `referenceNumber`
from `invoice`
where `groupId` = 3550
and `referenceNumber` >= 301
limit 1;
这是该表的架构:
CREATE TABLE `invoice` (
`id` int(10) UNSIGNED NOT NULL,
`groupId` int(11) NOT NULL,
`referenceNumber` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;
ALTER TABLE `invoice`
ADD PRIMARY KEY (`id`),
ADD KEY `invoice_groupid_index` (`groupId`),
ADD KEY `invoice_referencenumber_index` (`referenceNumber`);
ALTER TABLE `invoice`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
COMMIT;
非常感谢您的帮助!
-
如果您将结果粘贴为纯文本而不是肮脏的小屏幕截图,尤其是截断的屏幕截图。
-
你有没有调整过你的服务器?有些人运行的库存配置绝对缺乏内存。
-
您还需要在
groupId, referenceNumber上为您正在执行的查询类型建立一个索引。groupId索引只能让你到目前为止,其余的行必须与扫描匹配。 -
如果首先要了解有关服务器性能的一件事,那就是
innodb_buffer_pool_size是绝对地批判的。如果它设置得太小,您将无缘无故地牺牲大量性能。 -
@tadman 你完全正确!!我用
groupId, referenceNumber创建了一个索引,现在第一个查询只需要 0.0005 秒。太棒了,真的非常感谢!!
标签: mysql performance mariadb