Я использую простой запрос JOIN
, однако MySQL продолжает показывать неверный индекс в плане EXPLAIN
.
Он выбирает индекс для столбца, который не участвует в запросе.
Запрос основан на первичном ключе. Я попытался удалить индекс, но затем оптимизатор выбрал другой нерелевантный индекс.
В моем случае таблица a содержит ~ 2,5 миллиона записей, а таблица b ~ 5 миллионов записей. Каждая запись в a имеет ~2 записи в b.
Я использую MySql 5.6.
Я сделал ANALYZE
и CHECK
на столах.
Запрос занимает около 70 секунд, он использует неправильный индекс и выполняет вложенный цикл, почему?
SELECT
IFNULL(SUM(a.val),0) as total
FROM a , b
where a.id = b.a_id;
1 SIMPLE a index PRIMARY idx_a_c_id 5 2406691 Using index
1 SIMPLE tv ref idx_a_id idx_a_id 4 capb_1.a.id 1
# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
'1', 'SIMPLE', 'spd_transaction', 'index', 'PRIMARY', 'idx_a_c_id', '5', NULL, '2406691', 'Using index'
'1', 'SIMPLE', 'tv', 'ref', 'idx_a_id', 'idx_a_id', '4', 'a.id', '1', NULL
a
это spd_transaction?b
для телевизора? - person Jason Heo   schedule 20.11.2013A
(id
int(11) NOT NULL,p_id
int(11) DEFAULT NULL,date1
datetime NOT NULL,c_id
int(11) NOT NULL,acc_id
int(11) DEFAULT NULL,co_id
int(11) DEFAULT NULL, PRIMARY КЛЮЧ (id
), КЛЮЧidx_c_id
(c_id
), КЛЮЧidx_acc_id
(acc_id
), КЛЮЧfk_co_id
(co_id
), ) ДВИГАТЕЛЬ = InnoDB ПО УМОЛЧАНИЮ CHARSET = utf8; - person Gidi Kern   schedule 20.11.2013b
(id
int(11) NOT NULL,a_id
int(11) NOT NULL,another_id
int(11) NOT NULL,val
decimal(32,6) DEFAULT NULL, PRIMARY KEY (id
), UNIQUE KEYuk_a_id_another_id
(a_id
,another_id
), ОГРАНИЧЕНИЕfk_a_id
ВНЕШНИЙ КЛЮЧ (a_id
) ССЫЛКИa
(id
) ПРИ УДАЛЕНИИ НЕТ ДЕЙСТВИЙ ПРИ ОБНОВЛЕНИИ НЕТ ДЕЙСТВИЙ ) ENGINE=InnoDB DEFAULT CHARSET=utf8; - person Gidi Kern   schedule 20.11.2013EXPLAIN
, когда вы принудительно используете первичный ключ? - person Stoleg   schedule 20.11.2013