mysql - 我想减少 MYSQL 查询执行时间。我的查询需要很长时间?
问题描述
以下 MYSQL 查询需要很长时间才能执行 如何减少执行时间任何解决方案?该表包含超过 1000 条记录我正在尝试根据产品表中的价格 (prd_price) 更新排序顺序 (prd_sort_order)
素质:-
SET @rank = 0;
UPDATE tbl_products p SET p.prd_sort_order=@rank:=@rank+1
WHERE p.prd_booking_status=1
AND p.prd_status=1
ORDER BY p.prd_price DESC
解决方案
在我看来,您的代码使用以下模式的查询:
SET @rank = something;
UPDATE tbl p SET p.prd_sort_order=@rank:=@rank+1
WHERE p.prd_booking_status=1
AND p.prd_status=1
ORDER BY p.prd_price DESC
SELECT MAX(prd_sort_order) as prd_sort_order FROM tbl
WHERE prd_booking_status = 1
AND prd_status=1
表上的特定复合索引将对您的更新查询有很大帮助。您可以像这样从 phpmyadmin 之类的 sql 客户端创建它。
CREATE INDEX tbl_price_sort_order
ON tbl (booking_status, prd_status, prd_price DESC);
这是有效的,因为您的查询可以随机访问具有匹配预订和 prd 状态的第一行的索引,然后按顺序读取索引以获取正确顺序的行。
同样,您的选择查询可以使用此索引。
CREATE INDEX tbl_prd_sort_order
ON tbl (booking_status, prd_status, prd_sort_order DESC);
注意:如果两个用户同时运行这个 php 程序,你可能会得到垃圾。尝试以 开头START TRANSACTION;
和结尾的查询序列COMMIT;
以避免并发混淆。
我是如何解决这个问题的?
- 我将 SQL 查询与所有 php 内容隔离开来。我希望你这样做了,但没关系。
- 我在它们之间寻找了一个通用的 WHERE 和 ORDER BY 模式。
- 我使用我在 Marcus Windand 的在线书籍中的数据库索引知识来找出对您有帮助的索引。
你将来可以自己做这种事情。StackOverflow 的重点是让人们自给自足。
而且,不得不说,这个应用程序的设计方式永远不会很快。此代码每次运行时都会更新表中的大部分行,这需要时间。随着你的桌子变大,它需要更多的时间:O(n)。这不好。当您从表中查找内容时,最好在您使用的 SELECT 查询中执行此价格排名工作。随意问另一个问题。
推荐阅读
- python - 如何跳过抓取时无法打开的链接?
- java - 如何删除每行末尾的尾随空格?
- selenium-webdriver - Robot Framework:如果任何关键字失败,请截图
- python-3.x - 使用 Delaunay 三角剖分创建 networkx 图
- javascript - 如何使用 HTML 发送 Google App Script 电子邮件
- cmake - 目标类型取决于通用规则
- java - 如何解释番石榴中 ImmutableList.builder().build() 中使用的泛型?
- image - 写入临时文件
- powershell - 从 FullName 属性中提取路径到结果中
- powershell - 使用 powershell 从 Windows 10 中删除本地用户和数据