2015-01-26 2 views
2

Я использую MySQL 5.1.73 (FreePBX), и наша таблица cdr (журнал вызовов) перестала использовать свои индексы. Странно то, что если я дублировать таблицу и заполнить ее с существующими данными CDr, индексы являются используются в копии:Индекс MySQL вообще не используется

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 был бы просто сбросом таблицы и воссоздать ее в течение некоторого времени простоя. Однако это похоже на битву, потому что мне не нравится не знать, какова фактическая проблема.

+0

Вы уверены, что индекс не упал ('ОПИСАТЬ cdr_copy')? – Mark

+0

Как долго длится конкретный запрос, который вы указали, чтобы выполнить (не объяснять, а запускать)? Если запрос быстрый, может быть, есть разница между тем, что объясняет говорит и что делает сервер. Вы пробовали «REPAIR TABLE?», Который испустит диагностику. –

+0

@MrMarchello - запрос на cdr_copy использует индекс, а не наоборот. – oobayly

ответ

0

Я не знаю, почему индексы самопроизвольно прекратили работу в стороне от ошибки, но вы всегда можете использовать указательные подсказки.

См https://dev.mysql.com/doc/refman/5.1/en/index-hints.html

Как так SELECT * FROM table1 USE INDEX (col1_index,col2_index) WHERE col1=1 AND col2=2 AND col3=3;

Смежные вопросы