【发布时间】: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