【问题标题】:MySQL optimizing tips for the ABS calculationMySQL ABS 计算的优化技巧
【发布时间】:2012-09-21 20:56:02
【问题描述】:

我有 MySQL 数据库:

CREATE TABLE IF NOT EXISTS `tableexample` (
    `id` int(11) NOT NULL auto_increment,
    `val0` tinyint(1) NOT NULL,
    `val1` tinyint(1) NOT NULL,
    `val2` tinyint(1) NOT NULL,
    `val3` tinyint(1) NOT NULL,
    `val4` tinyint(1) NOT NULL,
    `val5` tinyint(1) NOT NULL,
    .................
    `val1996` tinyint(1) NOT NULL,
    `val1997` tinyint(1) NOT NULL,
    `val1998` tinyint(1) NOT NULL,
    `val1999` tinyint(1) NOT NULL,
     UNIQUE KEY `id` (`id`),
) ENGINE=MEMORY ;

这个查询最多可以有 500 个字段:

SELECT
  ( ABS(`val1`-12)
  + ABS(`val22`-22)
  + ABS(`val23`-3)
  + ABS(`val45`-87)
  + ABS(`val76`-23)
    ........
  + ABS(`val1324`-7)
  + ABS(`val1576`-29)
  ) as valcal,
  id
FROM `tableexample`
ORDER BY valcal ASC
LIMIT 5

此外,ABS 中的数字对于每个查询(12、22、3、87、23、7、29,...)都是唯一的,并且可以在 0-99 范围内。

我做了一些测试:

for 1000 records the sql run in 0.024 seconds
for 10000 records the sql run in 0.231 seconds
for 50000 records the sql run in 1.123 seconds
for 100000 records the sql run in 2.179 seconds
for 200000 records the sql run in 4.316 seconds
for 300000 records the sql run in 6.451 seconds

您有什么优化技巧吗,因为数据库中大约有 300,000 条记录?

【问题讨论】:

  • 我的建议是重新规范这件事.. yipes
  • 如果这个性能不可接受,我认为你需要重新评估你的设计,因为我认为你不会从尝试优化abs中获得任何收益。
  • 是否允许修改/创建表/索引?它是某种最近邻算法吗?
  • 是的,我可以修改/创建表/索引。你有什么秘诀吗?亚历克斯

标签: mysql optimization


【解决方案1】:

此查询将始终需要遍历所有 300,000 条记录并为每条记录执行 500 次计算。它大约每秒进行 23M 次计算,这还不错。优化这一点的唯一方法是更好的硬件,但即便如此也很难。

添加索引无济于事。它可以提供帮助的唯一方法是彻底重新考虑您的结构或逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 2012-08-30
    • 1970-01-01
    相关资源
    最近更新 更多