【问题标题】:Adding composite indexes on MYSQL table在 MYSQL 表上添加复合索引
【发布时间】:2011-08-11 09:25:54
【问题描述】:

我有一张这样的桌子

CREATE TABLE IF NOT EXISTS `billing_success` (
`bill_id` int(11) NOT NULL AUTO_INCREMENT,
`msisdn` char(10) NOT NULL,
`circle` varchar(2) NOT NULL,
`amount` int(11) NOT NULL,
`reference_id` varchar(100) NOT NULL,
`source` varchar(100) NOT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`bill_id`),
KEY `msisdn` (`msisdn`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8573316 ;

我想添加复合索引来优化查询。这是我生成报告的表格,最近它变得非常慢。这些是我生成报告的查询

1.SELECT msisdn,amount,circle FROM billing_total_success WHERE (source='XX' OR source='Y' OR source='STR') AND (time like '$date%')

2.SELECT msisdn,amount,circle FROM billing_total_success WHERE source <> 'RNH' AND source <> 'STR' AND source <> 'XAS' AND source <> 'RTR' AND (time like '$date%')

3.SELECT msisdn,amount,circle FROM billing_total_success WHERE (source='STR' OR source='RER' OR source='ASD') AND time BETWEEN  '$date1' AND '$date2'

4.SELECT msisdn,amount,circle FROM billing_total_success WHERE (source='RNH') AND time BETWEEN  '$date1' AND '$date2'

请告诉我应该在哪里为这些查询添加索引以进行优化,以及如何在给定查询的情况下添加适当的索引。

【问题讨论】:

  • 您应该查看EXPLAIN 声明。见dev.mysql.com/doc/refman/5.1/en/using-explain.html
  • 我添加了一个涵盖时间和来源的索引。对吗?
  • 这样试试。 alter table billing_success 按此顺序添加索引 i (source,time)。我不是mysql优化大师,但我认为最好避免喜欢按时搜索。等待其他建议。
  • 正如@nick 所说-在时间戳字段上使用LIKE 效率低下。最好在其他一些查询中使用BETWEEN

标签: mysql optimization indexing scalability innodb


【解决方案1】:

A.您可能需要时间戳字段上的索引。

然而,这不一定是故事的结局;如果您的查询是对时间戳索引进行范围扫描,那么在 InnoDB 中将其作为二级索引不一定是一个好主意。

B.将时间戳作为主键的第一部分

这是违反直觉的,但是作为主键上的 InnoDB 集群,将时间戳放在主键的第一部分会使二级索引范围扫描变为主键范围扫描,这通常会更好。二级索引范围扫描需要检索范围内的每一行;主键扫描已检索到它已经

C.按时间分区

如果您的查询速度很慢,因为表变得太大而无法存储内存(经常需要 IO 读取),但您总是查询一个小的(ish)时间范围,请考虑使用每日或每小时分区。

当然,如果您的用户位于不同的时区,则每日分区的效果会差很多,因为他们的日子与分区的日子重叠。

分区需要脚本对表进行持续维护(创建新分区;删除旧分区)。您需要提供和测试这些脚本,因此这显然是开发人员的开销。操作也需要监控这些脚本,因此它们也有操作开销。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2011-03-01
    相关资源
    最近更新 更多