MySQL索引根本没有被使用
我正在使用MySQL 5.1.73(FreePBX),我们的cdr(调用日志)表已经停止使用其索引。奇怪的是,如果我复制表,并用现有的cdr数据填充它,那么索引将在副本中使用:MySQL索引根本没有被使用,mysql,indexing,Mysql,Indexing,我正在使用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 sele
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表,它似乎说一切正常。显然,简单的方法就是转储表,并在停机期间重新创建它。然而,这似乎有点不确定,因为我不喜欢不知道实际问题是什么。您确定索引没有被删除(
描述cdr\u copy
)?您提到的特定查询运行(不是解释,而是运行)需要多长时间?如果查询速度很快,那么explain所说的和服务器所做的可能会有所不同。您是否尝试过发出诊断信息的修复表?
。@MrMarchello-对cdr\u copy的查询使用的是索引,而不是相反的方式。@OllieJones-使用索引的查询需要0.00s(小于CLI客户端的精度),而没有索引时,使用BEVER子句需要1.83s,索引为0.02s vs 2.11s我尝试了快速修复,但没有任何区别。当服务器不在使用时,我必须尝试进行全面修复。因此,扩展修复没有任何影响,也没有任何抱怨,所以我只是删除并重新创建了索引。我的查询现在正在使用索引。还是想知道为什么。