我在主从上有一个完全相同的 myisam 表。索引未在主服务器上使用。
mysql> explain select count(date_time) from ox_data_summary_ad_hourly where date_time = '2012-03-08 00:00:00' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: ox_data_summary_ad_hourly
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 32212292
Extra: Using where
1 row in set (0.00 sec)
从站的解释计划:
mysql> explain select count(date_time) from ox_data_summary_ad_hourly where date_time = '2012-03-08 00:00:00' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: ox_data_summary_ad_hourly
type: ref
possible_keys: ox_data_summary_ad_hourly_date_time
key: ox_data_summary_ad_hourly_date_time
key_len: 8
ref: const
rows: 156769
Extra: Using index
1 row in set (0.00 sec)
master 是 5.0,而 slave 是 5.5 版本(如果重要的话)。
这是否意味着 master 上的索引文件已损坏?
MySQL 查询优化器的通常经验法则是:
如果 EXPLAIN 计划必须通过索引读取超过 5% 的表行,则索引将被取消(排除)并执行全表扫描。
对于从站,要读取 32212292 行中的 156769 行。那是 0.4867%。因此,使用索引。
关于Master,MySQL Query Optimizer 排除了索引是非常令人不安的。正如@ypercube 评论的那样,也许没有索引。
SHOW CREATE TABLE ox_data_summary_ad_hourly\G
您应该通过在 Master 和 Slave 上运行来确保。如果它们不同,请在问题中发布两个输出。另外,请同时运行
SELECT COUNT(1) FROM ox_data_summary_ad_hourly;
Master 和 Slave 并发布这些计数