Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Добрый день.
Ситуация такая. Во первых мы имеем дело с большой таблицей debtors 3000-5000 записей. Мне нужно выбрать из этой таблицы записи только те, которые не входят в записи, получаемые другим запросом.
Сам запрос
Неактивен
Добрый день.
Конструция not in обычно плохо работает в mysql, как вариант - переписать запрос через join.
Помимо этого:
еще покажите пожалуйста explain всего запроса,
explain подзапроса, и
show create table всех табличек, а то не очень понятно, какие поля к какой таблице относятся.
Неактивен
Неактивен
explain запросов (полного и отдельно подзапроса) приложите плиз.
Неактивен
Вот так выглядит без PHP
Неактивен
Покажите результат
explain SELECT debtors . * , FROM_UNIXTIME( block_start_date ) AS DATE
FROM debtors
WHERE users_id NOT
IN (
SELECT users_id
FROM debtors, complete, notes
WHERE block_start_date < compl_date
AND compl_note = note_id
AND n_abon_id = users_id
AND is_juridical =0
)
AND is_juridical =0
ORDER BY DATE DESC
LIMIT 0 , 20
и
explain SELECT users_id
FROM debtors, complete, notes
WHERE block_start_date < compl_date
AND compl_note = note_id
AND n_abon_id = users_id
AND is_juridical =0
Неактивен
Полного
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY debtors ALL NULL NULL NULL NULL 3706 Using where; Using filesort
2 DEPENDENT SUBQUERY debtors ref users_id users_id 4 func 1 Using where
2 DEPENDENT SUBQUERY complete ALL NULL NULL NULL NULL 93 Using where; Using join buffer
2 DEPENDENT SUBQUERY notes eq_ref PRIMARY PRIMARY 4 rightside_debt.complete.compl_note 1 Using where
Подзапроса
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE complete ALL NULL NULL NULL NULL 93
1 SIMPLE notes eq_ref PRIMARY PRIMARY 4 rightside_debt.complete.compl_note 1
1 SIMPLE debtors ref users_id users_id 4 rightside_debt.notes.n_abon_id 1 Using where
Неактивен
Так-с...
Для начала
добавьте составной ключ на deptors.users_id,deptors.is_juridical
alter table deptors add index users_id__is_juridical(users_id,is_juridical);
И ключ на complete.compl_date
alter table `complete` add index compl_date(compl_date);
И составной ключ на debtors.is_juridical,debtors.block_start_date
alter table debtors add index is_juridical__block_start_date(is_juridical,block_start_date);
Есть разница в скорости?
explain снова приведите плиз.
Отредактированно deadka (12.12.2011 06:29:28)
Неактивен
Сделаю.
Я вот погуглил.
1
подскажите как составить запрос который бы выводил только те поля из l_client где l_client.l_client_id != b_account.l_client_id?
2
SELECT ..
FROM
l_client
LEFT JOIN
b_account
ON l_client.l_client_id = b_account.l_client_id
WHERE b_account.l_client_id IS NULL;
имхо так.
Может на основе этого попробовать составить запрос.
Неактивен
Неактивен
Ну да, идея left join для данного запроса именно такова.
Что-то такое (не проверял)
Неактивен
Поправил сообщение, где перечислены рекомендуемые индексы.
Отредактированно deadka (12.12.2011 06:29:59)
Неактивен
Неактивен
Полный
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY debtors range is_juridical__block_start_date is_juridical__block_start_date 4 NULL 3475 Using where; Using filesort
2 DEPENDENT SUBQUERY debtors ref users_id,users_id__is_juridical,is_juridical__bloc... users_id 4 func 1 Using where
2 DEPENDENT SUBQUERY complete ALL compl_date NULL NULL NULL 93 Using where; Using join buffer
2 DEPENDENT SUBQUERY notes eq_ref PRIMARY PRIMARY 4 rightside_debt.complete.compl_note 1 Using where
Подзапрос
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE complete ALL compl_date NULL NULL NULL 93
1 SIMPLE notes eq_ref PRIMARY PRIMARY 4 rightside_debt.complete.compl_note 1
1 SIMPLE debtors ref users_id,users_id__is_juridical,is_juridical__bloc... users_id 4 rightside_debt.notes.n_abon_id 1 Using where
Скорость вроде как подросла, но незначительно. Надо делать с left join. Попробую.
Благодарю за наводку.
Отредактировал с третьим индексом.
Отредактированно seyfer (12.12.2011 06:35:27)
Неактивен
Странно. Покажите еще раз show create table таблиц плиз...
Или приложите дамп таблиц, сам поковыряю чуть позже.
Отредактированно deadka (12.12.2011 06:35:18)
Неактивен
Мой запрос с NOT IN - Showing rows 0 - 19 (20 total, Query took 2.8619 sec)
Ваш запрос с LEFT JOIN (кстати работает)
Showing rows 0 - 19 (20 total, Query took 0.0606 sec)
Разница на лицо. огромная благодарность от меня Вам.
Сейчас попробую внедрить в приложение.
Неактивен
Да, хороший прирост . Пожалуйста. А если уж так душа просит использования in и not in - то попробуйте MariaDB.
Неактивен
теперь другая проблема
http://sqlinfo.ru/forum/viewtopic.php?pid=28995
Неактивен
Страниц: 1