我正在使用MySQL 5.1.73(FreePBX),我们的cdr(调用日志)表已停止使用其索引。奇怪的是,如果我复制表并使用现有的cdr数据填充它,则副本中使用的索引 :
mysql> explain select * from cdr where calldate='2013-01-24 15:27:19'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: cdr
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1391088
Extra: Using where
1 row in set (0.00 sec)
mysql> CREATE TABLE `cdr_copy` (
-> `calldate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
-> `clid` varchar(80) NOT NULL DEFAULT '',
-> `src` varchar(80) NOT NULL DEFAULT '',
-> `dst` varchar(80) NOT NULL DEFAULT '',
-> `dcontext` varchar(80) NOT NULL DEFAULT '',
-> `channel` varchar(80) NOT NULL DEFAULT '',
-> `dstchannel` varchar(80) NOT NULL DEFAULT '',
-> `lastapp` varchar(80) NOT NULL DEFAULT '',
-> `lastdata` varchar(80) NOT NULL DEFAULT '',
-> `duration` int(11) NOT NULL DEFAULT '0',
-> `billsec` int(11) NOT NULL DEFAULT '0',
-> `disposition` varchar(45) NOT NULL DEFAULT '',
-> `amaflags` int(11) NOT NULL DEFAULT '0',
-> `accountcode` varchar(20) NOT NULL DEFAULT '',
-> `uniqueid` varchar(32) NOT NULL DEFAULT '',
-> `userfield` varchar(255) NOT NULL DEFAULT '',
-> `did` varchar(50) NOT NULL DEFAULT '',
-> `recordingfile` varchar(255) NOT NULL DEFAULT '',
-> `cnum` varchar(40) NOT NULL DEFAULT '',
-> `cnam` varchar(40) NOT NULL DEFAULT '',
-> `outbound_cnum` varchar(40) NOT NULL DEFAULT '',
-> `outbound_cnam` varchar(40) NOT NULL DEFAULT '',
-> `dst_cnam` varchar(40) NOT NULL DEFAULT '',
-> KEY `calldate` (`calldate`),
-> KEY `dst` (`dst`),
-> KEY `accountcode` (`accountcode`),
-> KEY `uniqueid` (`uniqueid`)
-> ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.02 sec)
mysql> insert into cdr_copy select * from cdr;
Query OK, 1391093 rows affected (33.59 sec)
Records: 1391093 Duplicates: 0 Warnings: 0
mysql> explain select * from cdr_copy where calldate='2013-01-24 15:27:19'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: cdr_copy
type: ref
possible_keys: calldate
key: calldate
key_len: 8
ref: const
rows: 1
Extra:
1 row in set (0.00 sec)
我检查了 cdr 表,似乎说一切正常。显然, easy 方法只是转储表,并在一些停机时间重新创建它。然而,这似乎有点躲闪,因为我不喜欢不知道实际问题是什么。