MySql表性能优化

标签 mysql sql

我有一个具有以下结构的表

CREATE TABLE rel_score (
  user_id bigint(20) NOT NULL DEFAULT '0',
  score_date date NOT NULL,
  rel_score decimal(4,2) DEFAULT NULL,
  doc_count int(8) NOT NULL
  total_doc_count int(8) NOT NULL
  PRIMARY KEY (user_id,score_date),
  KEY SCORE_DT_IDX (score_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=1

该表将存储应用程序中每个用户自 2000 年 1 月 1 日至今的每一天的 rel_score 值。我估计记录总数将超过7亿条。我用 6 个月的数据(约 3000 万行)填充了表,查询响应时间约为 8 分钟。这是我的查询,

select 
  user_id, max(rel_score) as max_rel_score
from
  rel_score
where score_date between '2012-01-01' and '2012-06-30'
group by user_id
order by max_rel_score desc;

我尝试使用以下技术优化查询,

  1. 在 score_date 列上分区
  2. 在 score_date 列上添加索引

查询响应时间略微缩短至不到 8 分钟。

如何缩短响应时间? table 的设计是否合适?

此外,我无法将旧数据移动到存档中,因为允许用户查询整个数据范围。

最佳答案

如果您在 score_date 的同一级别对表进行分区,则不会减少查询响应时间。

尝试创建另一个仅包含日期年份的属性,将其转换为 INTEGER ,根据此属性对表进行分区(您将获得 13 个分区),然后重新执行查询以查看 。

关于MySql表性能优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18575548/

相关文章:

php - MySQLi查询错误

php - 'where 子句 PHP/MySQL 问题中的未知列 '...'

mysql - 使用 Doctrine2 : Error: Expected end of string, 的查询问题得到 '.'

sql - 为什么点或句点 ('.' ) 在 SQL Server 中被视为数字?

php - 仅使用 SQL 获取 Magento 中每个产品的类别名称。这个查询速度慢吗?

mysql - INNER JOIN 和 GROUP BY 以防止重复结果

mysql - 如何打印最大编号的商店名称特定月份和年份的销售额?

SQL 通过带索引的多列过滤

php - 如何从一个表中选择字段并按另一个表中的字段排序

sql - 有没有一个重构 SQL 的工具,有点像 ReSharper for SQL