Архив

Публикации с меткой «MySQL»

MySQL. Выборка записей в случайном порядке.

03 Фев 2011

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


SELECT * FROM table_name ORDER BY RAND() LIMIT 1000

Нежелательной, с точки зрения производительности, является конструкция
ORDER BY RAND()
В таких случаях более производительным вариантом будет использование следующей хранимой процедуры с последующим запросом:
Читать полностью…

MySQL , ,

MySQL MOD

26 Окт 2010

Очередная ошибка выполнения запроса.


SELECT mod FROM user;

На первый взгляд ничего криминального, но поскольку MySQL не хочет выполнять запрос – возникает подозрение, что mod – зарезервированное слово.
На самом деле MOD – это SQL функция!
MOD(N, M) – возвращает, как и во многих языках программирования, остаток от деления числа N на число M.
Угораздило ж меня назвать так поле таблицы. :)

Ошибка исправляется заключением имени поля в кавычки (те, что на клавише с буквой Ё).


SELECT `mod` FROM user;

Вот, даже CSS класс, подсвечивающий код, понимает это.

MySQL ,

MySQL DELETE синтаксическая ошибка

08 Июн 2010

Есть ли синтаксическая ошибка в следующем SQL-запросе?

DELETE FROM mytable t WHERE t.id IN (1,2,3,4,5)

Ошибка есть! Правда, я не сразу понял, в чем дело и почему MySQL не хочет пропускать запрос.

Правильным будет любой из следующих вариантов:


DELETE FROM mytable WHERE id IN (1,2,3,4,5);
DELETE t FROM mytable t WHERE t.id IN (1,2,3,4,5);

Суть в том, что если используете алиас для таблицы, то его нужно указать после DELETE.

Или можно указать имя таблицы вместо алиаса.

СУБД должна знать из какой таблицы производить удаление.

Более понятна такая логика MySQL будет при использовании JOIN-синтаксиса оператора DELETE, или просто при удалении из нескольких таблиц:


-- удаление произойдет только из таблицы table1
DELETE t1 FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.table1_id
WHERE t1.id IN (1,2,3,4,5)

-- удалятся данные из таблиц table1 и table2
DELETE t1, t2
FROM table1 t1, table2 t2, table3 t3
WHERE t1.id=t2.id AND t2.id=t3.id

MySQL , , ,

MySQL оптимизация. NOT NULL.

27 Апр 2010

mysql
В данной заметке хочу обратить (в первую очередь свое) внимание на один из важных моментов, влияющих на производительность при выполнении SQL-запросов:

При создании таблиц в базе данных,
поля всех типов желательно объявлять как NOT NULL!

Это немного экономит память, и главное – увеличивает скорость выполнения запросов. Улучшение производительности происходит из-за того, что СУБД не проверяет такие поля на предмет наличия пустых значений. Таким образом, уменьшается время анализа таблиц. Т.е. просто необходимо объявить поле, как непустое, задать значения по умолчанию (например, «» – для символьных, 0 – для числовых, ‘0000-00-00 00:00:00′ – для даты и времени и т.п.) и радоваться жизни.
Типы полей BLOB и TEXT не могут содержать значения по умолчанию.
Так же не рекомендуется индексировать поля, которые не объявлены, как NOT NULL.

MySQL ,