MySQL 查询大数据时速度非常慢

2023-12-24

我不是 MySQL 高手,但我明白了,我刚刚继承了一个相当大的表(600,000 行和大约 90 列(请杀了我...)),并且我创建了一个较小的表来将其链接到类别表。

我正在尝试使用左连接查询所述表,因此我在一个对象中拥有两组数据,但它运行速度非常慢,而且我还不够热,无法对其进行排序;我真的很感激一些关于为什么这么慢的指导和解释。

SELECT 
    `products`.`Product_number`,
    `products`.`Price`,
    `products`.`Previous_Price_1`,
    `products`.`Previous_Price_2`,
    `products`.`Product_number`,
    `products`.`AverageOverallRating`,
    `products`.`Name`,
    `products`.`Brand_description`
FROM `product_categories`
LEFT OUTER JOIN `products`
ON `products`.`product_id`= `product_categories`.`product_id`
WHERE COALESCE(product_categories.cat4, product_categories.cat3,
product_categories.cat2, product_categories.cat1) = '123456'
AND `product_categories`.`product_id` != 0

这两个表是MyISAM,产品表在Product_number和Brand_Description上有索引,而product_categories表在所有组合列上都有唯一索引;如果此信息有任何帮助的话。

继承了这个系统后,我需要在我用核武器攻击它之前尽快让它工作并正确地完成它,所以现在的任何帮助都将赢得你我最大的尊重!

[编辑] 这是解释扩展的输出:

+----+-------------+--------------------+-------+---------------+------+---------+------+---------+----------+--------------------------+
| id | select_type | table              | type  | possible_keys | key  | key_len | ref  | rows    | filtered | Extra                    |
+----+-------------+--------------------+-------+---------------+------+---------+------+---------+----------+--------------------------+
|  1 | SIMPLE      | product_categories | index | NULL          | cat1 | 23      | NULL | 1224419 |   100.00 | Using where; Using index |
|  1 | SIMPLE      | products           | ALL   | Product_id    | NULL | NULL    | NULL |  512376 |   100.00 |                          |
+----+-------------+--------------------+-------+---------------+------+---------+------+---------+----------+--------------------------+

优化表

为了建立基线,我首先建议运行OPTIMIZE TABLE http://dev.mysql.com/doc/refman/5.1/en/optimize-table.html两个表上的命令。请注意,这可能需要一些时间。来自docs http://dev.mysql.com/doc/refman/5.1/en/optimize-table.html:

OPTIMIZE TABLE如果您删除了大部分内容,则应使用 表或者如果您对可变长度的表进行了许多更改 行(具有VARCHAR, VARBINARY, BLOB, or TEXT列)。 删除的行保存在链表中,并保存在后续的行中INSERT操作重用旧的行位置。您可以使用OPTIMIZE TABLE到 回收未使用的空间并对数据文件进行碎片整理。后 对表进行大量更改,这个说法也可能会改进 使用表的语句的性能有时会显着。

[...]

对于 MyISAM 表,OPTIMIZE TABLE工作原理如下:

  1. 如果表已删除或拆分行,请修复该表。

  2. 如果索引页未排序,请对其进行排序。

  3. 如果表的统计信息不是最新的(并且无法通过对索引排序来完成修复),请更新它们。

Indexing

如果空间和索引管理不是问题,您可以尝试添加综合指数 http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html on

product_categories.cat4, product_categories.cat3, product_categories.cat2, product_categories.cat1

如果您使用这些列的最左边的子集,建议这样做often在您的查询中。查询计划表明它可以使用cat1指数product_categories。这很可能只包括cat1柱子。通过将所有四个类别列添加到索引中,它可以更有效地查找所需的行。来自docs http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html:

MySQL 可以使用多列索引来进行测试所有列的查询 索引中的列,或仅测试第一列的查询 前两列、前三列,依此类推。如果您指定 索引定义中按正确顺序排列的列,一个单一的 复合索引可以加速同一对象上的多种查询桌子。

结构

此外,鉴于您的桌子有90列你还应该知道更宽的表可能会导致查询性能变慢 http://www.mysqlperformanceblog.com/2006/06/09/why-mysql-could-be-slow-with-large-tables/。您可能需要考虑垂直分区 http://apheliondynamics.com/blog/2010/02/11/database-optimization-vertical-partitioning-in-mysql/你的表分成多个表:

列太多会使记录大小膨胀,进而导致记录大小膨胀 导致更多的内存块被读入和读出内存,从而导致 更高的输入/输出。这可能会损害性能。解决这个问题的一种方法是 将您的表拆分为更小、更独立的表,其中包含更小的表 基数比原来的多。现在应该可以更好地 阻塞因子(如上所述),这意味着更少的 I/O 和更快的速度 表现。像这样分解桌子的过程是 称为垂直分区.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 查询大数据时速度非常慢 的相关文章

随机推荐