Оптимизация запроса

peshkov

Новичок
Оптимизация запроса

Доброе утро!

Есть запрос

PHP:
DELETE FROM list 
WHERE `id` IN(SELECT id_line FROM (SELECT *
							       , GROUP_CONCAT(id) as id_line
                                        		       , DATE_FORMAT(date_operation,"%d-%m-%Y") as `date` 
					  	  FROM jos_billing_user_speaking_list 
					  	  GROUP BY `date`
						  HAVING `date`= '24-09-2010'
Суть данного запроса следующая, Необходимо удалить все записи за определенную дату (время не важно). В БД дата храниться в формате 0000-00-00 00:00:00 (timestamp).

Ну а теперь вопросы:
1. Почему данные запрос удаляет только по одной записи?
2. Как можно оптимизировать данный запрос?
 

Wicked

Новичок
1. а почему id сравнивается с group_concat(id) ?
2. сначала explain запроса

-~{}~ 24.09.10 12:17:

3. нафига там вообще 2 подзапроса, группировка, having, форматирование даты в идиотский формат?
 

peshkov

Новичок
Wicked
Предложите другой вариант, который на Ваш взгляд лучше.

Формат даты не имеет значение(время не должно влиять на запрос)

PHP:
DELETE FROM list 
					  WHERE `id` IN(SELECT id_line FROM (SELECT *
							       , GROUP_CONCAT(id) as id_line
                                        		       , DATE_FORMAT(date_operation,"%d-%m-%Y") as `date` 
					  	  FROM list 
					  	  GROUP BY `date`
						  HAVING `date`= '24-09-2010'
) t1 );
Пример записи в таблице

NAME | date_operation | ID
vasy 2010-09-24 08:55:23 2
vasy 2010-09-24 08:56:23 3
vasy 2010-09-24 08:57:23 4
vasy 2010-09-24 08:58:23 5
vasy 2010-09-24 08:59:23 6
vasy 2010-09-24 09:00:23 7
 

zerkms

TDD infected
Команда форума
[sql]
DELETE l FROM list l
INNER JOIN jos_billing_user_speaking_list j ON j.id = l.id AND j.`date` BETWEEN '2010-09-24' AND '2010-09-24 23:59:59'
[/sql]
 

zerkms

TDD infected
Команда форума
Чтобы всё в итоге было совсем чотко - убедись, что на таблице `j` создан составной индекс id+date.
 

Wicked

Новичок
скорее наоборот, (date, id) :)
но пусть explain рассудит... если мы когда-нибудь дождёмся его от ТС :)
 

zerkms

TDD infected
Команда форума
peshkov

Кстати да, обсудили в аське ситуацию с Wicked.

Вкратце:

1. Если innodb - тогда индекса по date (при условии, что id - PK) должно хватить
2. Если не innodb - тогда индекс или id + date, или date + id

Проверить как именно - на живых данных (на большом объёме) на основе EXPLAIN и посмотреть, меняет ли оптимизатор таблицы местами или нет. Если нет - тогда id+date, если да - тогда, соответственно, просто date
 

peshkov

Новичок
Мне предложили другой вариант

[SQL]
delete from jos_billing_user_speaking_list
where cast(`date_operation` as date)='20100924'
[/SQL]

Что скажете?
 

Gas

может по одной?
Мне предложили другой вариант
Во первых, тебе ж из таблицы list нужно было удалять. А во вторых, в предложенном варианте не будет использоваться индекс по date_operation, так что он не ахти.
 

zerkms

TDD infected
Команда форума
мы скажем, что для того, чтобы получать хорошие ответы сразу - нужно изначально описывать ситуацию (предметная область, схема данных). именно ситуацию, а не давать кривой неработающий запрос и просить переписать.
 

zerkms

TDD infected
Команда форума
LONGMAN
Удали этот коммент и создай новую тему.
 
Сверху