Почему использование синтаксиса NOT IN в MySQL вызывает сбой сервера БД? - PullRequest
0 голосов
/ 12 января 2012

У меня есть две таблицы mysql, одна из которых имеет эти поля

Имя таблицы - residential:

ListingID varchar(12),
ListingStatus varchar(15)

с первичным ключом на ListingID и индексом на ListingStatus.

Другой стол - mlscheck:

mls varchar(12), 
status varchar(15) 

с тем же первичным ключом для mls и indes для статуса.

Когда я пытаюсь сделать что-то вроде:

delete from residential 
where ListingStatus = "Active" and 
ListingID NOT IN(select mls from mlscheck where status = "Active")

даже a:

delete from residential 
where ListingStatus = "Active" 
    and LIstingID NOT IN(select mls from mlscheck)   

ни один не работает, оба сбивают мою базу данных, и я должен перезапустить.

Должен ли я учиться использовать объединения, объединения и т. Д.? Я думал, что НЕ В был приличной командой. Могу ли я получить какой-то вклад от некоторых из вас экспертов?

Ответы [ 2 ]

0 голосов
/ 12 января 2012

Оператор NOT IN может быть дорогим для таблицы с большими записями. Судя по имени вашей таблицы, вы пытаетесь что-то сделать с листингами MLS, которые представляют собой большой набор данных.

Что вы можете сделать, это написать скрипт, который выполняет удаление фрагмента по фрагменту:

удалить из резиденции, где ListingStatus = "Active" и ListingID NOT IN (выберите mls из mlscheck, где status = "Active" LIMIT 0, 100)

удалить из резиденции, где ListingStatus = "Active" и ListingID где ListingStatus = "Active" и ListingID NOT IN (выберите mls из mlscheck где status = "Active" LIMIT 101, 200)

удалить из резиденции, где ListingStatus = "Active" и ListingID где ListingStatus = "Active" и ListingID NOT IN (выберите mls из mlscheck где status = "Active" LIMIT 201, 300)

и т.д ..

То есть, если вы не хотите использовать путь JOIN, упомянутый BAK.

0 голосов
/ 12 января 2012

По производительности объединения всегда лучше или равны подзапросам

этот запрос тяжел для сервера, который должен выбрать все строки на mls, и это для каждой строки в residential

Вот почему происходит сбой базы данных.

При использовании объединений:

DELETE r FROM residential r
LEFT JOIN mlscheck
    ON mls = ListingID
WHERE ListingStatus = "Active"
    AND mls IS NULL

Только residential строки удаляются. (что r), когда не найдено ни одной соответствующей строки mls.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...