首页 >数据库 >mysql教程 >如何优化缓慢的 MySQL 查询以提高性能并减少磁盘 I/O?

如何优化缓慢的 MySQL 查询以提高性能并减少磁盘 I/O?

Linda Hamilton
Linda Hamilton原创
2024-12-30 20:24:11964浏览

How Can I Optimize a Slow MySQL Query to Improve Performance and Reduce Disk I/O?

优化 MySQL 查询以减少执行时间和磁盘写入

您的 MySQL 查询遇到性能问题,需要几分钟才能完成并写入执行期间的磁盘。这会显着影响网页的响应能力。为了解决这个问题,我们将探索一种涉及数据建模和索引优化的解决方案。

您提到的慢查询是:

SELECT * 
FROM poster_prodcat, 
     poster_data, 
     poster_categories 
WHERE poster_data.apnumber = poster_prodcat.apnumber 
  AND poster_categories.apcatnum = poster_prodcat.apcatnum 
  AND poster_prodcat.apcatnum='623'  
ORDER BY aptitle ASC 
LIMIT 0, 32

根据 EXPLAIN 输出,查询正在执行完整的查询对海报_prodcat 表进行表扫描,该表包含超过 1700 万行。这会导致执行时间过长。

为了优化查询性能,我们可以实施以下更改:

标准化和索引:

  1. 标准化数据: 将海报_prodcat 表转换为标准化结构两个表:海报和类别。创建第三个表海报_类别,以建立海报和类别之间的关系。
  2. 创建索引:在海报、类别和海报_类别表中的相应列上创建索引。这将使数据库能够快速定位数据,而无需执行全表扫描。

以下是更新架构的示例:

CREATE TABLE poster (
  poster_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL UNIQUE,
  PRIMARY KEY (poster_id)
) ENGINE=InnoDB;

CREATE TABLE category (
  cat_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL UNIQUE,
  PRIMARY KEY (cat_id)
) ENGINE=InnoDB;

CREATE TABLE poster_category (
  cat_id MEDIUMINT UNSIGNED NOT NULL,
  poster_id INT UNSIGNED NOT NULL,
  PRIMARY KEY (cat_id, poster_id),
  INDEX (poster_id) -- Clustered composite index
) ENGINE=InnoDB;

数据标准化并建立索引后,查询应该执行得更快,从而显着减少执行时间。

以上是如何优化缓慢的 MySQL 查询以提高性能并减少磁盘 I/O?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn