SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 23.08.2012 16:05:57

Marianna
Участник
Зарегистрирован: 23.08.2012
Сообщений: 6

Выборка по одному значению из всех таблиц базы

В базе много таблиц, все одинаковой структуры, нужно из каждой взять по одному значению и поместить во временно созданную таблицу.
И так мои эксперименты:
Так работает с одной таблицей:

INSERT INTO `test1a`.`test` SELECT * FROM `test1`.`9a94e3` ORDER BY last_use_time ASC LIMIT 1


Очень надеялась, что прокатит такой синтаксис, но меня обломали sad
INSERT INTO `test1a`.`test` SELECT * FROM `test1`.* ORDER BY last_use_time ASC LIMIT 1


Так выдаёт такую ошибку "Column 'last_use_time' in order clause is ambiguous"
INSERT INTO `test1a`.`test` SELECT * FROM `test1`.`9a94e3`,`test1`.`9a4993` ORDER BY last_use_time ASC LIMIT 1


Так вообще ничего не выходит
INSERT INTO `test1a`.`test` SELECT * FROM `test1`.`9a94e3` ORDER BY last_use_time ASC LIMIT 1,SELECT * FROM `test1`.`9b94e3` ORDER BY last_use_time ASC LIMIT 1

Это я пробывала решение с стаковерфлоу, где сказали писать все таблицы через запятую, но проблема в том, что мне нужны не полные таблицы, а только по одной записи с каждой.

Что бы сразу отпал вопрос "зачем" - пытаюсь обойти тормоза от "group by".

Неактивен

 

#2 23.08.2012 16:12:24

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка по одному значению из всех таблиц базы

Попробуйте через UNION

INSERT INTO `test1a`.`test`
SELECT * FROM `test1`.`9a94e1` ORDER BY last_use_time ASC LIMIT 1
UNION
SELECT * FROM `test1`.`9b94e2` ORDER BY last_use_time ASC LIMIT 1
UNION
...
UNION
SELECT * FROM `test1`.`9b94e10` ORDER BY last_use_time ASC LIMIT 1


Или в цикле пройдите по всем именам таблиц (откуда по одной строчке достать хотите) и серией запросом вставьте в Вашу временную таблицу.

При наличии индекса на last_use_time в Ваших таблицах сработает шустрее, чем без него.

А насчет обхождения тормозов от "group by" - можно с этого момента поподробнее? smile


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 23.08.2012 16:40:11

Marianna
Участник
Зарегистрирован: 23.08.2012
Сообщений: 6

Re: Выборка по одному значению из всех таблиц базы

Изначально все данные лежали в одной таблице, но запрос вида

SELECT ... GROUP BY ... ORDER BY ... LIMIT ...

Создаёт тормоза настолько сильные, что пропускная способность находится на уровне 15 в секунду. Проблема в том, что GROUP BY никак не может быть оптимизирован если верит документации к MySQL. Выглядит так, что данных всего около 100К записей, различных значений от GROUP BY  варьируется между 500 и 50К, я решила поэкспериментировать, разнести данные по разным таблицам на основе поля по которому делается GROUP BY, при запросе пробегать по всем таблицам, собирая данные в одну временную, и после чего из неё с нужным лимитом выдавать данные. Хотела заняться замером скорости, но уткнулась в синтаксис объединения.

Сейчас попробую ваше решение

Неактивен

 

#4 23.08.2012 16:44:59

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка по одному значению из всех таблиц базы

Изначально все данные лежали в одной таблице, но запрос вида
SELECT ... GROUP BY ... ORDER BY ... LIMIT ...

Приведите полностью текст запроса (и структуру таблички, включая индексы). Возможно, получится ускорить.

Проблема в том, что GROUP BY никак не может быть оптимизирован если верит документации к MySQL.

ТОЙ документации, где Вы это прочли - не верьте smile. Абсолютно ложное утверждение.

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


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 23.08.2012 18:46:47

Marianna
Участник
Зарегистрирован: 23.08.2012
Сообщений: 6

Re: Выборка по одному значению из всех таблиц базы

SELECT * FROM table GROUP BY sid ORDER BY time ASC LIMIT 1000

Неактивен

 

#6 23.08.2012 18:51:13

Marianna
Участник
Зарегистрирован: 23.08.2012
Сообщений: 6

Re: Выборка по одному значению из всех таблиц базы

там нету ничего особого, индекс на том столбце по которому ордеринг идёт.

Ваш пример не прошёл, вот что выдаёт "Incorrect usage of UNION and ORDER BY"

Неактивен

 

#7 23.08.2012 19:35:22

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка по одному значению из всех таблиц базы

Marianna написал:

там нету ничего особого, индекс на том столбце по которому ордеринг идёт.

Ваш пример не прошёл, вот что выдаёт "Incorrect usage of UNION and ORDER BY"

Да, Вы правы, надо было в скобки брать подвыбрки. Попробуйте вот так:

INSERT INTO `test1a`.`test`
(SELECT * FROM `test1`.`9a94e1` ORDER BY last_use_time ASC LIMIT 1)
UNION
(SELECT * FROM `test1`.`9b94e2` ORDER BY last_use_time ASC LIMIT 1)
UNION
...
UNION
(SELECT * FROM `test1`.`9b94e10` ORDER BY last_use_time ASC LIMIT 1);
 


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#8 23.08.2012 19:38:20

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка по одному значению из всех таблиц базы

Marianna написал:

SELECT * FROM table GROUP BY sid ORDER BY time ASC LIMIT 1000

Такой запрос некорректен по нескольким причинам.

1) Если Вы группируете по полю sid, то выбирать можно либо поле sid, либо остальные, но подействовав на них агрегирующей функцией. Что-то вроде
SELECT sid,max(time) FROM table GROUP BY sid ORDER BY time

2) Если Вы группируете по sid, то каким образом Вы результат хотите отсортировать то time? Это просто невозможно, так что запрос некорректен.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 23.08.2012 20:25:01

Marianna
Участник
Зарегистрирован: 23.08.2012
Сообщений: 6

Re: Выборка по одному значению из всех таблиц базы

Сейчас гляну, что у меня имеется, у меня нету прямого доступа к скриптам, сказали как есть, и что надо провер

Неактивен

 

#10 23.08.2012 22:08:47

Marianna
Участник
Зарегистрирован: 23.08.2012
Сообщений: 6

Re: Выборка по одному значению из всех таблиц базы

Как бы правильно объяснить
Есть таблица, у неё есть столбец sid по которому нужно групировать, и столбец time по которому нужно с каждой группы максимальное значение получить. Я не знаю как там запрос написан, нету его у меня, мне поставили задачу, обойти GROUP BY

Неактивен

 

#11 24.08.2012 12:48:35

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка по одному значению из всех таблиц базы

Marianna написал:

Как бы правильно объяснить
Есть таблица, у неё есть столбец sid по которому нужно групировать, и столбец time по которому нужно с каждой группы максимальное значение получить. Я не знаю как там запрос написан, нету его у меня, мне поставили задачу, обойти GROUP BY

То, что Вы написали решается в лоб запросом:
SELECT max(time), sid FROM mytable group by sid;
Если создать составной индекс (sid, time), то тогда вообще хорошо, выбор данных идёт по индексу - достаточно шустро.

Посему постановка задачи - обойти group by кажется мне очень странной smile.
Но если уж так надо: обойдите в цикле все sid'ы, и выберите запросом на каждый из них max(time).


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson