Я пытался выполнить объединение двух таблиц в MySQL, и запрос будет выполняться в течение минуты или двух, прежде чем у меня закончится память без получения результатов. Я далек от эксперта по базам данных, поэтому я не уверен, плохо ли я пишу свои запросы, плохо ли настроены некоторые параметры MySQL или мне действительно нужно делать что-то совсем другое с моим запросом. К вашему сведению, база данных находится локально на моей машине.
У меня есть большая таблица (~ 2 миллиона записей), где один из столбцов является идентификатором в небольшой таблице (~ 3000 записей). В случае, если это имеет значение, идентификатор не уникален в большой таблице, но уникален в маленькой таблице. Я пробовал различные варианты следующего запроса, но ничего не работает:
SELECT big_table.*,
small_table.col
FROM big_table
left outer join small_table on (big_table.small_id = small_table.id)
Я много анализирую данные, для которых требуются все 2 миллиона строк, хотя и не обязательно в одном запросе. Вот результаты моего «показать создание таблицы»:
'big_table', 'CREATE TABLE 'big_table' (
'BIG_ID_1', varchar(12) NOT NULL,
'BIG_ID_2', int(100) NOT NULL,
'SMALL_ID' varchar(8) DEFAULT NULL,
'TYPICAL_OTHER_COLUMN' varchar(3) DEFAULT NULL,
...
PRIMARY KEY ('BIG_ID_1', 'BIG_ID_2')
) ENGINE=MyISAM DEFAULT CHARSET=latin1'
'small_table', 'CREATE TABLE `small_table` (
`id`, varchar(8) NOT NULL DEFAULT '''',
`col`, varchar(1) DEFAULT NULL,
...
PRIMARY KEY (`id`),
KEY `inx_id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1'
Вот результат «объяснения» для одного из моих запросов-кандидатов:
id select_type table type possible_keys key key_len ref rows extra 1 SIMPLE big_table ALL NULL NULL NULL NULL 1962193 1 SIMPLE small_table eq_ref PRIMARY,inx_id PRIMARY 10 db_name.big_table.SMALL_ID 1
EXPLAIN SELECT ...
для вашего запроса, а также выводSHOW CREATE TABLE big_table
иSHOW CREATE TABLE small_table
. - person Mark Byers   schedule 18.09.2010inx_id
в маленькой таблице полностью избыточен, поскольку первичный ключ также может использоваться в качестве индекса — я бы рекомендовал вам удалить индекс, но сохранить первичный ключ. Однако это не улучшит производительность этого запроса. - person Mark Byers   schedule 19.09.2010