Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте!
Есть таблица, состоящая из двух полей, одно varchar(150) (назовём его pole1), другое int (назовём его chislo).
пример данных в таблице:
pole1 |chislo
слово1 1
слово2 2
слово2 3
слово3 3
слово1 3
слово4 5
Нужно сделать выборку чисел из поля chislo, где в втречается два слова("слово1" и слово2"") (слов может быть и больше чем 2). Т.е. для данного примера - это 3. Думаю принцип понятен.
Для это я использую сейчас вложенные запросы, вот пример:
SELECT chislo FROM `testtable` WHERE pole1 = 'слово1' and chislo IN (SELECT chislo FROM `testtable` WHERE pole1 = 'слово2')
Можно ли как-нибудь оптимизировать запрос в данной ситуации?
Заранее всем спасибо!
Неактивен
Можно систематизировать запрос, чтобы было легче добавлять несколько слов
SELECT chislo
FROM tablename t1
JOIN tablename t2 USING (chislo)
...
WHERE t1.slovo = 'slovo1' AND t2.slovo = 'slovo2' ... ;
Заодно Вы гарантируете, что по каждому слову таблица будет оббегаться только
один раз. Ключики нужны на оба поля по-отдельности.
Неактивен
paulus написал:
Можно систематизировать запрос, чтобы было легче добавлять несколько слов
SELECT chislo
FROM tablename t1
JOIN tablename t2 USING (chislo)
...
WHERE t1.slovo = 'slovo1' AND t2.slovo = 'slovo2' ... ;
Заодно Вы гарантируете, что по каждому слову таблица будет оббегаться только
один раз.
А разве в приведённом мною запросе оббегается не один раз? Или я что-то не так понял?
paulus написал:
Ключики нужны на оба поля по-отдельности.
Вы не могли бы поподробнее этот момент раскрыть?
Что скажете про этот запрос:
select chislo
from `testtable` b
join
(select chislo from `testtable` where pole1 = 'слово1' ) a
ON a.chislo = b.chislo
where pole1 = 'слово2'
?
Неактивен
Вот 2 варианта запроса:
1)
Неактивен
Во втором случае у Вас, кажется, лишний DISTINCT. Без него количество результатов
должно быть одинаковым.
Лучше, наверное, второй - очень элегантное решение, мне нравится
Неактивен
А GROUP BY (да еще и HAVING) разве не хуже подзапроса?
Неактивен
Ну, query plan у него будет такой же, а лаконичность записи и простота масштабирования
соблазняют
Неактивен
query plan будет такой же в MySQL 6.0, а в 5ой версии еще 50 на 50
Неактивен
Ну, 100% гарантию дать не могу, но, кажется, что в любом случае будет использоваться
худший подход "сортировка без индекса" и потом выкидывание оттуда ненужных значений.
Во втором случае, правда, будет использоваться именно прямой подсчет количества строк,
а не определение повторов. Но не думаю, что это даст хоть сколь нибудь заметное прогибание
в производительности.
Неактивен
rgbeast написал:
query plan будет такой же в MySQL 6.0, а в 5ой версии еще 50 на 50
а как вообще можно сравнить их query plan ?
Неактивен
Query plan можно посмотреть, выполнив команду EXPLAIN SELECT ... для соответствующего запроса.
Неактивен
мммм... explain это понятно
но я не уверен что эксплэин этих двух запросов одинаков будет
я думал вы что то более функциональное в виду имели
Неактивен
vario EXPLAIN SELECT юзай
Неактивен