[mysql] помогите с запросом плиз

t332

в sql я человек неопытный, и запрос у меня работает "слишком" долго, помогите плиз ускорить.
Ситуация такая. Есть две таблицы:
create table tmp1 (id int,name varchar(100
create table tmp2 (id int,name varchar(100

в каждой из них около 10000 записей.
Запрос такой (выводит пересечение этих таблиц по tmp1.id=tmp2.id):
select t1.name,t2.name from tmp1 t1,tmp2 t2 where t1.id=t2.id
выполняется около 40 секунд.
Тот же результат но используя C/C++ я получаю менее чем за секунду.
Как сделать, что бы mysql делал это побыстрее?

evgen5555

Переписать
select t1.name,t2.name from tmp1 t1,tmp2 t2 where t1.id=t2.id

в иннер-джойны типа
select t1.name, 
t2.name
from tmp1 t1
inner join tmp2 t2
on t1.id=t2.id

?

Boris1980

Индексы есть?

t332

select t1.name,t2.name from tmp1 t1 inner join tmp2 t2 on t1.id=t2.id - уже 20 сек.
а какие-нибудь "циклы" в mysql писать можно?
я слышал, что в pl/sql можно...

t332

не знаю что такое индексы - не пользовался

evgen5555

А нахрена собственно нужно ускоряться в mysql? Сделай въеб-запросник на пхп, и всё.

Boris1980

Эх..
id - это primary key в таблице? Если да, то это и есть индекс.

rosali

Ну конечно нет у него никаких индексов, 10000 записей же всего, не может по стольку работать.

alter table tmp1 add key (id);
alter table tmp2 add key (id);

PS. inner join ничем не отличается от where. Так просто понятнее (некоторым )

kruzer25

> id - это primary key в таблице?
>> create table tmp1 (id int,name varchar(100
Судя по всему, нет.
И тогда тормоза уже вполне понятны --- количество операций порядка (количество элементов в tbl1)*(количество элементов в tbl2).
---
...Я работаю...

Boris1980

create table tmp1 (id int,name varchar(100
Ясно, что индекса нет, я уточнил просто.

t332

круто! меньше секунды!
дайте еще плиз ссылку почитать про индексы
(кроме документации на сайте mysql)
Спасибо всем.

Boris1980

Ае...
Ты, кстати, на приват не ответил.

evgen5555



PS. inner join ничем не отличается от where. Так просто понятнее (некоторым )
Это наглейший пиздёж. При юзании оператора запятая из mysql-client на таблице из 500000 записей сервак просто вылетает, при иннер-джойнах нет.
И ещё - внутреннее пересечение не эквивалентно WHERE.

kruzer25

Грубо говоря, когда ты одно из полей выбираешь индексом, для него строится дерево поиска --- таким образом, время поиска по индексу в таблице с n записями с O*(n) уменьшается до O*(lnn).
Но, если в таблице большое количество индексов, то время добавления/удаления сильно увеличивается. Так что, индексы стит использовать только тогда, когда это действительно необходимо.
---
...Я работаю...

durka82

inner join ничем не отличается от where. Так просто понятнее (некоторым )
А ты не путаешь с результатом работы оптимизатора?
А то для mssql и для оракл (по крайней мере не очень старых) это действительно так, но mysql запросто может и не оптимизировать.

rosali

но mysql запросто может и не оптимизировать

очень смешно

durka82

С чем конкретно ты не согласен?

6yrop

И ещё - внутреннее пересечение не эквивалентно WHERE.

как раз вот это пиздешь

При юзании оператора запятая из mysql-client на таблице из 500000 записей сервак просто вылетает, при иннер-джойнах нет.

от MySql вполне ожидаемо , хуево у него с перезаписью запросов

rosali

от MySql вполне ожидаемо

да это от -а ожидаемо я никогда ничего такого не видел

6yrop

автор треда такие же данные приводит, 40 сек против 20 сек, см. выше

rosali

Ну согласен, никогда не пробовал делать join без индекса

evgen5555



как раз вот это пиздешь
Обоснуй, хули.
Если рассуждать по-твоему, то

Select a.id
from a
where a.name LIKE 'a%'

тоже внутреннее пересечение

gopnik1994

не тормози
select t1.name,t2.name from tmp1 t1,tmp2 t2 where t1.id=t2.id
полностью эквивалентен
select t1.name, t2.name from tmp1 t1 [inner] join tmp2 t2 on t1.id=t2.id
если в некоторых субд это не так или выполняется за различное время, то это проблемы субд.
з.ы. [] обозначает необязательность

evgen5555

Меня поразило следующее утверждение:
inner join ничем не отличается от where

Может быть, у российских кодеров принято так выражаться, но у российских тестеров такая хуйня в документации будет считаться браком.

6yrop

причем тут индекс?
у кого стоит MySQL, посмотрите планы этих двух запросов, командой EXPLAIN. Должны быть одинаковыми, а что показывает MySQL?

durka82

К хорошему привыкают быстро.
Это не эквивалентность, а работа оптимизатора.

rosali

причем тут индекс?

Ну в смысле когда индекс есть я разности по скорости не замечал. А без индекса вот вы говорите, разница в два раза. Хотя у меня подозрение, что просто эксперимент плохо проведен, данные в память поднялись вот и быстрее вдвое, а от того в каком виде запрос записать может и не зависит.

gopnik1994

это одинаковая работа.
это работа не оптимизатора, а норма.
все отклонения - глюки и кривости.
Оставить комментарий
Имя или ник:
Комментарий: