SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 06.02.2015 11:43:57

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

Как правильно? (Чтобы не ложил ядро на 5.5 сек)

Хочу сделать выборку: вывести пользователей добавленных 'сегодня' и тех у которых есть созданные сегодня сообщения.
Делаю так:


SELECT DISTINCT (users.user_id),users.* FROM users LEFT JOIN us_kom ON users.user_id=us_kom.us_id
WHERE users.user_group='7' AND users.reg_date >= ('$temp_dat') OR us_kom.dat_kom >= ('$temp_dat') ORDER BY users.user_id DESC
 


Еще пробовал проставить индексы на дататаймы (BTREE) и запрос вот так:

SELECT DISTINCT (users.user_id),users.* FROM users LEFT JOIN us_kom ON users.user_id=us_kom.us_id
WHERE users.user_group='7' AND (users.reg_date >= ('$temp_dat') OR us_kom.dat_kom >= ('$temp_dat')) ORDER BY users.user_id DESC
 


Пользователей где то 1к, а сообщений 10к. И при запросе ложит одно ядро на core i7 секунд на 5-6!
Помогите пожалуйста, как это сделать правильно.

Неактивен

 

#2 06.02.2015 12:01:11

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Как правильно? (Чтобы не ложил ядро на 5.5 сек)

Попробуйте следующее

1. Убрать users.* из запроса. Получать только id, а остальную информацию уже потом.

2. Убрать OR - посмотреть на то, как будут работать 2 отдельных запроса. Выполнить их через UNION. Нужен составной индекс на (user_group, reg_date)

Неактивен

 

#3 06.02.2015 13:42:50

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

Re: Как правильно? (Чтобы не ложил ядро на 5.5 сек)

UNION не поддерживается говорит, из-за версии MySQLя наверно (5.5). А запросы поотдельности работают нормально

Неактивен

 

#4 06.02.2015 14:02:41

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Как правильно? (Чтобы не ложил ядро на 5.5 сек)

Какая ошибка возникает? Приведите ее текст, так как UNION есть во всех версиях MySQL.

Неактивен

 

#5 06.02.2015 14:05:43

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

Re: Как правильно? (Чтобы не ложил ядро на 5.5 сек)

1 The used SELECT statements have a different number of columns

Неактивен

 

#6 06.02.2015 14:14:10

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Как правильно? (Чтобы не ложил ядро на 5.5 сек)

Приведите запрос. Скорее всего разное количество колонок выбираете в первом и втором случаях. Желательно выбирать только user_id

Неактивен

 

#7 06.02.2015 14:20:07

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

Re: Как правильно? (Чтобы не ложил ядро на 5.5 сек)

(SELECT * FROM users WHERE user_group='7' and reg_date >= ('2015-02-06 07:00:00')) UNION (SELECT * FROM users JOIN us_kom ON users.user_id=us_kom.us_id WHERE us_kom.dat_kom >= ('2015-02-06 07:00:00') ORDER BY users.user_id DESC)

Неактивен

 

#8 06.02.2015 14:24:52

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Как правильно? (Чтобы не ложил ядро на 5.5 сек)

В первом случае выбираете только из users, а во втором из двух таблиц. Замените звездочку на `users`.`user_id`

Неактивен

 

#9 06.02.2015 14:30:26

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

Re: Как правильно? (Чтобы не ложил ядро на 5.5 сек)

Большое спасибо! Все зароботало! 282мс

Неактивен

 

#10 06.02.2015 14:34:06

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

Re: Как правильно? (Чтобы не ложил ядро на 5.5 сек)

а добавил индексы - 34мс! )

Неактивен

 

Board footer

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