Как лучше всего удалить одинаковые строчки из таблицы?

05.05.2009 от nikolay

Один из способов - сделать UNIQUE-индекс по тем полям, сочетание которых должно быть уникальным в пределах таблицы. Другой способ, подходящий именно для больших таблиц, - “пройтись” скриптом по таблице и, выбрав первичные ключи на удаление, удалить их. Есть еще варианты с временной таблицей, но, имхо, это неудачное решение для больших таблиц.

См. также:
Как удалить бинарные логи сервера MySQL?
Типы таблиц MySQL
Не используйте SELECT * FROM

Рубрики: Разное | Комментариев нет »

DES_ENCRYPT и DES_DECRYPT

05.05.2009 от nikolay

В базе данных можно хранить особо важный данные и в закрытом зашифрованном виде. Например, при помощи функций DES_ENCRYPT и DES_DESCRYPT. В этом случае данные шифруются при помощи алгоритма Triple-DES. Правда, для работы с этими функциями MySQL должен быть собранным с поддержкой SSL. Используются эти функции следующим образом:

DES_ENCRYPT('строка для шифрования', 'ключ')
DES_DECRYPT('зашифрованная строка', 'ключ')

См. также:
Шифрование данных в MySQL
VARCHAR, VARCHAR…
Упаковка/распаковка данных в таблицах

Рубрики: Разное | Комментариев нет »

Как определить самую ресурсоемкую таблицу MySQL?

05.05.2009 от nikolay

Для того, чтобы определить самую ресурсоемкую таблицу MySQL можно воспользоваться консольной утилитой mytop в Linux. Правда перед этим ее придется установить:

1) сначала установите требуемые модули Perl:

cpan -i Term::ReadKey
cpan -i Term::ANSIColor
cpan -i Time::HiRes

Для того, чтобы определить самую ресурсоемкую таблицу MySQL можно воспользоваться консольной утилитой mytop в Linux. Правда перед этим ее придется установить:

2) Далее установите сам mytop:

wget http://jeremy.zawodny.com/mysql/mytop/mytop-1.6.tar.gz
tar -zxvf mytop-1.6.tar.gz
cd mytop-1.6
perl Makefile.PL
make
make test
make install

3) Для просмотра информации о базе данных test, введите:

mytop -u root -p 'password' -h localhost -d test

Здесь
-u : имя пользователя
-p : пароль
-h : хост
-d : имя базы данных.

См. также:
Создание новой таблицы на базе старой ч. 2
SHOW CONTRIBUTORS
Создание новой таблицы по образу и подобию уже существующей

Рубрики: Утилиты, Разное | Комментариев нет »

Размер таблиц MEMORY в MySQL

15.04.2009 от nikolay

Это, конечно, логично, но не всегда сразу очевидно. При работе с таблицей типа MEMORY важно всегда знать, что удаление строк в ней не влияет на размер занимаемой памяти, до тех пор, пока не будет выполнен хотя бы такой фейковый запрос (фейковый потому, что по сути ничего в структуре таблицы не меняется, хотя размер занимаемой ОЗУ при этом пересчитывается):

ALTER TABLE tbl_name engine=memory;

См. также:
Список поддерживаемых типов таблиц в MySQL
Типы таблиц MySQL
Имена таблиц чувствительные к регистру… но не всегда!

Рубрики: Разное, Производительность | Комментариев нет »

Имена таблиц чувствительные к регистру… но не всегда!

15.04.2009 от nikolay

Забавно, но в линуксоподобных системах, как и ожидалось, таблицы META и meta это совершено разные таблицы. И это хорошо. Плохо если проект разрабатывался изначально в MAC OS X или Windows, поскольку там такого различия (впрочем как и для файлов) не делается. Будьте внимательны! Лучшее решение с учетом вышеописанного - называть таблицы в едином стиле, к примеру, всегда в нижнем или всегда в верхнем регистре.

См. также:
Размер таблиц MEMORY в MySQL
Типы таблиц MySQL
Вывод доступных таблиц текущей базы данных MySQL

Рубрики: Разное | Комментариев нет »

VARCHAR, VARCHAR…

15.04.2009 от nikolay

Интересно, что начиная с версии MySQL 5.0.3 поля типа VARCHAR() могут быть длинной до 65535 байт. Ранее поля данного типа не могли быть длинее 255 символов.
Впрочем, не стоит забывать о том, что вообще максимальный размер всей строки в таблице MySQL не может быть более чем 65535 байт (суммарно по всем столбцам). Также следует помнить что в кодировки UTF-8 один символ может требовать для хранения до 3 байт данных.

Также для данного релиза MySQL примечательно то, что начиная с версии 5.0.3 концевые пробельный символы при вставке в поля VARCHAR не удаляются, как это было ранее. Будьте внимательны!

См. также:
Получение списка возможных значений поля ENUM
Дата последнего обновления таблицы
MySQL+XML: новые операторы в версии 5.1.5

Рубрики: Новости, Разное | Комментариев нет »

Как удалить бинарные логи сервера MySQL?

15.04.2009 от nikolay

Судя по документации бинарные логи MySQL можно легко удалить, выполнив под соответствующими привилегиями запрос вида:

RESET master;

См. также:
Как лучше всего удалить одинаковые строчки из таблицы?
Быстрый перенос базы данных с одного сервера на другой
Как узнать версию MySQL?

Рубрики: Разное | Комментариев нет »

Быстрый перенос базы данных с одного сервера на другой

14.04.2009 от nikolay

Имея доступ к консоли исходного сервера можно легко скопировать БД на другой сервере (например, при переезде вебсайта к другому хостинг-провайдеру). Единственное требование для успешности этой операции - новый сервер должен разрешать удаленные подключения к БД. Итак, как можно сделать копию БД на другом сервере?

1. Войдите в консоль на исходном сервере.

2. Введите команду mysqladmin -h ‘destination_host’ -u user -p create dest_db, где destination_host - ip адрес или имя удаленного сервера, user - имя пользователя на удаленном сервере, а dest_db имя создаваемой базы данных.

3. Введите команду mysqldump -u user2 –password=XXXX –opt –compress source_db | mysql -h ‘destination_host’ -u user -p dest_db, user2 и XXXX это логин и пароль на локальном сервере.

См. также:
Как сбросить пароль MySQL?
Название текущей базы данных MySQL
Вывод доступных баз данных MySQL

Рубрики: Настройки, Разное | Комментариев нет »

Изменяем параметр max_allowed_packet на лету

08.04.2009 от nikolay

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

SET max_allowed_packet = 1500000;

Таким образом, мы можем временно для конкретной сессии менять значения данного параметра.

См. также:
LAST_INSERT_ID и его параметр
DES_ENCRYPT и DES_DECRYPT
Вывод результатов запроса по вертикали в консоли MySQL

Рубрики: Настройки, Разное | Комментариев нет »

Шифрование данных в MySQL

08.04.2009 от nikolay

Речь идет о функциях AES_ENCRYPT и AES_DECRYPT, позволяющих шифровать и расшифровывать данные с использованием официального алгоритма AES (”Расширенный стандарт шифрования”). Шифрование выполняется с длинной ключа в 128 бит. Впрочем, как написано в официальной документации MySQL, можно увеличить длину до 256 бит, повозившись с исходниками.

SELECT AES_DECRYPT(
    (SELECT AES_ENCRYPT('секретный текст', 'мой ключ')), 
    'мой ключ'
)

См. также:
DES_ENCRYPT и DES_DECRYPT
Повозимся с NULL-полями таблиц!
Быстрая справка по MySQL :)

Рубрики: Конструкции языка, Разное | Комментариев нет »

Особенности работы с UTF-8 и MySQL

01.04.2009 от nikolay

Если вы планируете работать с MySQL в кодировке UTF-8 (обычно это нужно когда и сайт будет в соответствующей кодировке), то вам нужно знать несколько особенностей по работе с БД:

  • После подключения к БД из скриптов первым обязательно выполните запрос SET NAMES UTF8
  • У самой БД, всех ее таблицах и полях должна быть указана кодировка и сравнение utf8_general_ci

См. также:
Кодировки, кодировки, кодировки…
Пара слов о полнотекстовом поиске
DES_ENCRYPT и DES_DECRYPT

Рубрики: Разное | Комментариев нет »

Считаем контрольные суммы в MYSQL

01.04.2009 от nikolay

Да, да, MySQL поддерживает и алгоритм CRC32, при помощи которого можно получать контрольные суммы как для произвольной строки, так и для поля (полей) определенных строк таблицы. К примеру:

SELECT CRC32('Считаем контрольные суммы в MYSQL');

выведет 2586716546. Великолепно!

См. также:
О конструкции SELECT CASE
Имена таблиц чувствительные к регистру… но не всегда!
Медленный ORDER BY RAND()

Рубрики: Разное | Комментариев нет »

Упаковка/распаковка данных в таблицах

01.04.2009 от nikolay

Многие ли знают что MySQL, начиная с версии 4.1.1, поддерживает две замечательные функции - COMPRESS и DECOMPRESS? Служат они для сжатия объемных данных. Могут применятся при вставке и выборке данных:

INSERT INTO data VALUES(COMPRESS('ооочень длинная строка'))
SELECT DECOMPRESS(TEXT) FROM data

См. также:
Опция SQL_BUFFER_RESULTS
Быстрый перенос базы данных с одного сервера на другой
VARCHAR, VARCHAR…

Рубрики: Разное, Производительность | Комментариев нет »

SHOW CONTRIBUTORS

01.04.2009 от nikolay

В 6-й версии MySQL появился новый служебный запрос - SHOW CONTRIBUTORS, выводящий таблицу с информацией о людях, которые вносят вклад в развитие MySQL или осуществляют поддержку компании MySQL AB. Для каждого лица отображается имя, местоположение и комментарий.

См. также:
Вывод доступных таблиц текущей базы данных MySQL
Разработчики MySQL… Кто они?
Вывод доступных баз данных MySQL

Рубрики: Разное | Комментариев нет »

SELECT SQL_SMALL_RESULT…

25.03.2009 от nikolay

Опция SQL_SMALL_RESULT использовуется с конструкциями GROUP BY и DISTINCT в тех случаях когда необходимо указать MySQL что результат запроса будет содержать мало строк. В этом случае MySQL использует быстрые временные таблицы и не сортирует данные во временнных таблицах.

См. также:
SELECT SQL_BIG_RESULT…
Повозимся с NULL-полями таблиц!
Быстрая справка по MySQL :)

Рубрики: Конструкции языка, Разное | Комментариев нет »

6 важных советов по созданию БД в MySQL

25.03.2009 от nikolay

Немного советов в копилку разработчика баз данных:

  • Выбирайте правильный тип данных для чисел. В MySQL 9 типов числовых данных. В Oracle, например, он всего один.
  • Используйте TIMESTAMP вместо DATETIME, первый тип требует для хранения всего 4 байта, по сравнению с 8-мью байтами для второго.
  • Используйте по возможности поля ENUM вместо строковых данных.
  • Указывайте для полей NOT NULL, это экономит 1 байт для каждой строки.
  • Не используйте SELECT *, экономьте память и трафик.
  • При оптимизации запросов при помощи EXPLAIN старайтесь достичь отсутствия “using filesort” и “using temporary table”.

ЗЫ. Воспользовался недавно этими советами при разработке интернет магазина контактных линз.

См. также:
Опция SQL_BUFFER_RESULTS
Медленный ORDER BY RAND()
Регистрозависимый LIKE

Рубрики: Разное, Производительность | Комментариев нет »

Доступные кодировки в MySQL

25.03.2009 от nikolay

Настраивая MySQL или преобразовывая кодировку БД часто требуется знать как пишется название той или иной кодировки. Доступные кодировки в MySQL можно поглядеть специальным служебным SQL-запросом вида:

SHOW CHARACTER SET

См. также:
Повозимся с NULL-полями таблиц!
Кодировки, кодировки, кодировки…
Конструкция SELECT SQL_NO_CACHE…

Рубрики: Конструкции языка, Разное | Комментариев нет »

MySQL: error 28

18.03.2009 от nikolay

Если вы получили от MySQL сообщение об ошибке №28, то не пугайтесь, проблема банальная - на жестком диске кончилось место и нужно всего лишь освободить какую-то часть и перезапустить MySQL. Вчера потратил пару часов, пока разобрался с аналогичной проблемой у себя на сервере.

См. также:
Функция UUID()
Свой ORDER BY
Опция SQL_BUFFER_RESULTS

Рубрики: Разное, Производительность | Комментариев нет »

SELECT HIGH_PRIORITY…

18.03.2009 от nikolay

Конструкция SELECT HIGH_PRIORITY полезна в тех случаях, когда команде выборки данных нужно дать максимально высокий приоритет над командами обновления и изменения таблицы. На обычных сайтах данные меняются не так часто, чтобы указывать подобные приоритеты, но в ряде веб-сервисов вполне может применяться.

См. также:
Быстрая справка по MySQL :)
Повозимся с NULL-полями таблиц!
Конструкция SELECT … WITH ROLLUP

Рубрики: Конструкции языка, Разное | Комментариев нет »

Опция i-am-a-dummy

18.03.2009 от nikolay

Буквально только что узнал о том, что у MySQL (при запуске из командной строки) есть опция i-am-a-dummy, являющаяся псевдонимом safe-updates. Надеюсь дословный перевод первой опции понятен. Перевод и предназначение второй - защита от случаных изменений. Думаю, что вольным переводом i-am-dummy можно считать фразу «защита от дурака».

См. также:
Пара слов о полнотекстовом поиске
Кодировки, кодировки, кодировки…
Конструкция SELECT SQL_NO_CACHE…

Рубрики: Разное | Комментариев нет »

Создание новой таблицы на базе старой ч. 2

11.03.2009 от nikolay

Раньше я уже писал, что создать новую таблицу по подобию (структуре) уже существующей таблицы очень просто. Однако в этом случае возможна только полная копия структуры и без копирования данных. Однако существует и другой, более гибкий способ скопировать таблицу… В этом случае запрос примет вид:

CREATE TABLE new_table SELECT * FROM existing_table

Фактически это конструкция для создания новой таблицы на основании какой-либо выборки, так например, можно построить частичную (по структуре) копию таблицы:

CREATE TABLE new_table SELECT a, b FROM existing_table

См. также:
Повозимся с NULL-полями таблиц!
SELECT SQL_BIG_RESULT…
Создание новой таблицы по образу и подобию уже существующей

Рубрики: Конструкции языка, Разное | Комментариев нет »

Функция UUID()

11.03.2009 от nikolay

А вы знали, что в MYSQL можно легко сгенерировать UUID (он же GUID и просто UID)? Речь идет о случайной генерации 128 битного числа представленного в формате “aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee”. Генерируется такое число вот так:

SELECT UUID()

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

  • первые три части генерируются по метке времени;
  • четвертая часть сохраняет в некоторой степеи уникальность в том случае, если временя теряет свою монотонность (например, из-за перевода часов на летнее время);
  • пятая часть генерируется в FreeBSD и Linux по MAC-адресу, а в остальных операционных системах это случайное 48-битное число.

См. также:
MySQL: error 28
LAST_INSERT_ID и его параметр
Пакетное переименование таблиц MySQL

Рубрики: Разное | Комментариев нет »

Создание новой таблицы по образу и подобию уже существующей

03.03.2009 от nikolay

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

CREATE TABLE NewTableName LIKE OldTableName

Недавно, коллега тут завис на пару минут когда понадобилась копия структуры таблицы :). Естественно, что в каком-нибудь EMS MySQL Manager копия делается в один клик, но когда у тебя только PhpMyAdmin, то стоит знать синтаксис подобных запросов.

См. также:
Создание новой таблицы на базе старой ч. 2
Когда MySQL не будет использовать индексы?
Повозимся с NULL-полями таблиц!

Рубрики: Конструкции языка, Разное | Комментариев нет »

Название текущей базы данных MySQL

03.03.2009 от nikolay

Название текущей базы данных MySQL можно получить самым что ни на есть тривиальным способом, если кто-то не знал:

SELECT DATABASE()

Странно, но обычно я знаю с какой базой работаю :)

См. также:
Вывод доступных таблиц текущей базы данных MySQL
Вывод доступных баз данных MySQL
Экспорт данных большого объема в БД на хостинге

Рубрики: Конструкции языка, Разное | Комментариев нет »

Пакетное переименование таблиц MySQL

03.03.2009 от nikolay

Конечно же, всем известен запрос RENAME TABLE … А кто-нибудь знал что за 1 запрос можно переименовывать любое число таблиц? Я, если честно, не знал. Оказывается все очень просто:

RENAME TABLE 
old_table_name_1 TO new_table_name_1, 
old_table_name_2 TO new_table_name_2;

См. также:
Замена подстроки в заданном столбце таблицы
Повозимся с NULL-полями таблиц!
“Спящие” запросы в MySQL

Рубрики: Конструкции языка, Разное | Комментариев нет »

Вывод доступных баз данных MySQL

25.02.2009 от nikolay

Для получения списка доступных баз данных на сервере MySQL для текущей учетной записи достаточно выполнить команду SHOW DATABASES.

См. также:
Вывод доступных таблиц текущей базы данных MySQL
Название текущей базы данных MySQL
Как избежать дубликатов в таблице при помощи индексов?

Рубрики: Разное | Комментариев нет »

Быстрая справка по MySQL :)

25.02.2009 от nikolay

Если Вы забыли синтаксис той или иной конструкции языка, то достаточно выполнить команду HELP:

mysql> HELP 'SELECT';
Name: 'SELECT'
Description:
Syntax:
SELECT
    [ALL | DISTINCT | DISTINCTROW ]
      [HIGH_PRIORITY]
      [STRAIGHT_JOIN]
      [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
      [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr, ...
    [FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name | expr | POSITION}
      [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | POSITION}
      [ASC | DESC], ...]
    [LIMIT {[OFFSET,] row_count | row_count OFFSET OFFSET}]
    [PROCEDURE procedure_name(argument_list)]
    [INTO OUTFILE 'file_name' export_options
      | INTO DUMPFILE 'file_name'
      | INTO @var_name [, @var_name]]
    [FOR UPDATE | LOCK IN SHARE MODE]]
 
SELECT IS used to retrieve rows selected FROM one OR more tables, AND
can include UNION statements AND subqueries. See [HELP UNION], AND
http://dev.mysql.com/doc/refman/5.0/en/subqueries.html.
 
The most commonly used clauses of SELECT statements are these:
 
o Each select_expr indicates a COLUMN that you want to retrieve. There
  must be at least one select_expr.
 
o table_references indicates the table OR tables FROM which to retrieve
  rows. Its syntax IS described IN [HELP JOIN].
 
o The WHERE clause, if given, indicates the condition OR conditions
  that rows must satisfy to be selected. where_condition IS an
  expression that evaluates to TRUE for each row to be selected. The
  statement selects all rows if there IS no WHERE clause.
 
  IN the WHERE clause, you can USE any of the functions AND operators
  that MySQL supports, except for aggregate (summary) functions. See
  [HELP =].
 
SELECT can also be used to retrieve rows computed without reference to
any table.

См. также:
GROUP BY & ORDER BY null
Дата последнего обновления таблицы
Список поддерживаемых типов таблиц в MySQL

Рубрики: Разное | Комментариев нет »

Список поддерживаемых типов таблиц в MySQL

25.02.2009 от nikolay

Узнать список поддерживаемых типов таблиц в MySQL можно командой SHOW ENGINES:

mysql> SHOW engines\G
*************************** 1. row ***************************
 Engine: MyISAM
Support: DEFAULT
Comment: DEFAULT engine as of MySQL 3.23 with great performance
*************************** 2. row ***************************
 Engine: MEMORY
Support: YES
Comment: HASH based, stored IN memory, useful for temporary tables
*************************** 3. row ***************************
 Engine: INNODB
Support: YES
Comment: Supports transactions, row-level locking, AND FOREIGN KEYS
*************************** 4. row ***************************
 Engine: BERKELEYDB
Support: NO
Comment: Supports transactions AND page-level locking
*************************** 5. row ***************************
 Engine: BLACKHOLE
Support: NO
Comment: /dev/NULL storage engine (anything you WRITE to it disappears)
*************************** 6. row ***************************
 Engine: EXAMPLE
Support: NO
Comment: Example storage engine
*************************** 7. row ***************************
 Engine: ARCHIVE
Support: YES
Comment: Archive storage engine
*************************** 8. row ***************************
 Engine: CSV
Support: YES
Comment: CSV storage engine
*************************** 9. row ***************************
 Engine: ndbcluster
Support: DISABLED
Comment: Clustered, fault-tolerant, memory-based tables
*************************** 10. row ***************************
 Engine: FEDERATED
Support: YES
Comment: Federated MySQL storage engine
*************************** 11. row ***************************
 Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
*************************** 12. row ***************************
 Engine: ISAM
Support: NO
Comment: Obsolete storage engine
12 rows IN SET (0.00 sec)

Здесь же выводится краткое описание каждого из типов. У меня на сервере, как видите, поддерживается целых 12 типов таблиц :)

См. также:
Типы таблиц MySQL
Дата последнего обновления таблицы
Вывод доступных таблиц текущей базы данных MySQL

Рубрики: Конструкции языка, Разное | Комментариев нет »

Повозимся с NULL-полями таблиц!

25.02.2009 от nikolay

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

SELECT 
name, 
IF(description IS NULL, "Описание не найдено", description) 
FROM goods

в данном случае если у товара из таблицы goods нет описания (значения поля равно NULL), система подменит значение NULL на “Описание не найдено”.

См. также:
О конструкции SELECT CASE
GROUP BY & ORDER BY null
Получение данных о стуктуре таблицы

Рубрики: Конструкции языка, Разное | Комментариев нет »

“Спящие” запросы в MySQL

25.02.2009 от nikolay

А вы знали, что начиная с версии 5.0.12 запросы в MySQL могут “спать”? :) Как? Да очень просто… так, например, запрос

SELECT sleep(5)

сделает паузу в исполнении на 5 секунд. При успешном завершении конструкции возвращается 0, при прерывании ее исполнения 1. Возможно указания отрезка времени в дробном представлении с точностью до микросекунд.

См. также:
Повозимся с NULL-полями таблиц!
Конструкция SELECT SQL_NO_CACHE…
Быстрая справка по MySQL :)

Рубрики: Конструкции языка, Разное | Комментариев нет »

Пара слов о полнотекстовом поиске

17.02.2009 от nikolay

Если у вас после реализации полнотекстового поиска почему-то не ищутся слова короче 4-х букв, то вам нужно просто изменить в конфиге MySQL значение опции ft_min_word_len. По умолчанию ft_min_word_len = 4, что означает минимальную длину у слова 4 символа. Но это еще не все, после изменения опции нужно:

  1. перезапустить MySQL-сервер
  2. выполнить для таблицы с полнотекстовым индексом команду REPAIR TABLE table_name QUICK

См. также:
Особенности работы с UTF-8 и MySQL
Конструкция SELECT SQL_NO_CACHE…
Опция i-am-a-dummy

Рубрики: Настройки, Разное | Комментариев нет »

Кодировки, кодировки, кодировки…

17.02.2009 от nikolay

Оказывается в настройках MySQL есть просто туева куча кодировок. Кодировка для того, кодировка для сего… а потом мы удивляемся отчего не работает сортировка или поиск по таблице. Вот коллега постарался и собрал информацию воедино. Собственно соответствующий список параметров конфига MySQL:

  • character_set_client - кодировка в которой данные будут поступать от клиента
  • character_set_connection - кодировка по умолчанию для всего, что в рамках соединения не имеет кодировки
  • character_set_database - кодировка по умолчанию для баз
  • character_set_filesystem - кодировка для работы с файловой системой (LOAD DATA INFILE, SELECT … INTO OUTFILE, и т.д.)
  • character_set_results - кодировка, в которой будет выбран результат
  • character_set_server - кодировка, в которой работает сервер
  • character_set_system - кодировка, в которой задаются идентификаторы MySQL, всегда UTF8
  • character_sets_dir - папка с кодировками

Лично я, работая только и всегда с UTF-8, придерживаюсь простого правила и у меня всегда все работает - база, таблицы и поля у меня всегда в кодировке utf8_general_ci, из скрипта при подключении выполняется SET NAMES UTF8. Всё!

Перевод технической документации MySQL осуществлен при поддержке бюро переводов Bues.ru.

См. также:
Доступные кодировки в MySQL
Имена таблиц чувствительные к регистру… но не всегда!
Как быстро узнать сколько всего строк без учета LIMIT?

Рубрики: Настройки, Разное | Комментариев нет »

Регистрозависимый LIKE

17.02.2009 от nikolay

А вы замечали, что LIKE обычно регистронезависим? А знаете как его отучить от этого дела? А очень просто, нужно всего лишь записывать этот оператор в виде:

SELECT * FROM texts WHERE name LIKE BINARY '%бла%'

См. также:
Повозимся с NULL-полями таблиц!
Конструкция SELECT SQL_NO_CACHE…
Для чего нужен STRAIGHT JOIN?

Рубрики: Конструкции языка, Разное | Комментариев нет »

О конструкции SELECT CASE

10.02.2009 от nikolay

В MySQL существует конструкция вида SELECT CASE, реализующая оператор выбора. К примеру, запрос

SELECT CASE id 
   WHEN 1 THEN 'первый' 
   WHEN 2 THEN 'второй' 
   ........ 
END FROM table_name

выведет вместо значения числового поля id его строковое название. В случае если сопоставление не будет найдено для какой-либо строки таблицы, будет подставлено значение NULL.

См. также:
Повозимся с NULL-полями таблиц!
Быстрая справка по MySQL :)
Когда MySQL не будет использовать индексы?

Рубрики: Конструкции языка, Разное | Комментариев нет »

Получение данных о стуктуре таблицы

10.02.2009 от nikolay

Для получения данных о структуре заданной таблицы существует специальная конструкция вида

DESCRIBE table_name

позволяющая узнать подробную информацию о каждом из столбцов таблицы - тип поля, null, тип индекса и дефолтное значение.

См. также:
Повозимся с NULL-полями таблиц!
Статистика MySQL сервера
Дата последнего обновления таблицы

Рубрики: Конструкции языка, Разное | Комментариев нет »

GROUP BY & ORDER BY null

27.01.2009 от nikolay

Оказывается при указании группировки в SQL-запросе по умолчанию всегда происходит сортировка таблицы - для больших таблиц это влечет за собой заметное снижение быстродействвие.

Для решения этой проблемы советуют принудительно дописывать ORDER BY null в конце запроса. Я решил попробовать потестировать оба варианта запроса:

Обычный подход

mysql> EXPLAIN SELECT aff FROM dic GROUP BY aff\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: dic
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 7888
        Extra: USING temporary; USING filesort
1 row IN SET (0.00 sec)

Оптимизированный подход

mysql> EXPLAIN SELECT aff FROM dic GROUP BY aff ORDER BY NULL\G                 *************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: dic
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 7888
        Extra: USING temporary
1 row IN SET (0.00 sec)

Как видно из результатов запрсоа EXPLAIN, на самом деле второй вариант будет отработан быстрее (я не про секунды в результатах), т.к. в по столбцу Extra видно что в первом варианте осуществляеся сортировка, а во втором - нет.

См. также:
Повозимся с NULL-полями таблиц!
Конструкция SELECT … WITH ROLLUP
6 важных советов по созданию БД в MySQL

Рубрики: Конструкции языка, Разное, Производительность | Комментариев нет »

Получение списка возможных значений поля ENUM

20.01.2009 от nikolay

Сегодня коллега при написании универсального php-скрипта задал интересный вопрос - как получить список возможных значений поля ENUM. Оказывается список возможных значений для поля типа ENUM определить довольно-таки легко, - нужно сделать запрос вида

DESCRIBE table_name field_name

и распарсить полученный результат.

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

mysql> DESCRIBE positions pos_type\G
*************************** 1. row ***************************
  FIELD: pos_type
   Type: ENUM('simple','inner_block','out_block')
   NULL: NO
    Key:
DEFAULT:
  Extra:
1 row IN SET (0.00 sec)

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

P.S. Кстати, судя по некоторым сообщениям, лучше всего в значениях поля ENUM русские буквы не использовать.

P.S.2. Интересная статья о производительности полей типа ENUM.

См. также:
Свой ORDER BY
6 важных советов по созданию БД в MySQL
Повозимся с NULL-полями таблиц!

Рубрики: Конструкции языка, Разное | Комментариев нет »

Как быстро узнать сколько всего строк без учета LIMIT?

20.01.2009 от nikolay

Иногда необходимо узнать число строк в таблице MySQL без учета оператора LIMIT. Большинство программистов в этой ситуации просто делают второй запрос - SELECT COUNT(*) FROM …, что, на самом деле, не очень хорошо. Обычно такая ситуация возникает при реализации постраничной прокрутки каких-либо данных.

На самом деле, начиная с 4-й версии MySQL существует возможность быстрого определения числа строк в запросе без учета ограничения по оператору LIMIT:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM positions LIMIT 1\G
*************************** 1. row ***************************
          id: 90
   id_series: 40
        name: MSC-GA25VB/MUH-GA25VB
      params: a:4:{i:2;s:3:"2,6";i:11;s:3:"3,0";i:4;s:11:"815x278x244";i:14;s:4:"0,82";}
   functions: a:0:{}
 description:
spec_comment:
    warranty: 3 ????
       price: 696.817
       FIXED: -1
         new: 0
    invertor: 0
        spec: 0
    pos_type: simple
     id_sort: 60
     visible: 1
1 row IN SET (0.00 sec)
 
mysql> SELECT FOUND_ROWS();
+--------------+
| FOUND_ROWS() |
+--------------+
|          399 |
+--------------+
1 row IN SET (0.00 sec)

См. также:
Быстрая справка по MySQL :)
Кодировки, кодировки, кодировки…
Как сбросить пароль MySQL?

Рубрики: Конструкции языка, Разное, Производительность | Комментариев нет »

Вывод результатов запроса по вертикали в консоли MySQL

20.01.2009 от nikolay

Недавно узнал, что в консоли MySQL можно выводить результаты запроса в гораздо более удобной форме, добавив в конце параметр \G. В случае указания данного параметра результаты запроса выводятся в вертикальном (горизонтальном? смотря относительно чего :)) порядке. Например:

mysql> SELECT * FROM config WHERE name='USD'\G
*************************** 1. row ***************************
   id: 78
 name: USD
value: 32.9085
1 row IN SET (0.00 sec)

См. также:
Свой ORDER BY
Выбор данных из таблицы в файл
Создаем образы (view) в MySQL

Рубрики: Разное | Комментариев нет »

Дата последнего обновления таблицы

20.01.2009 от nikolay

В языке запросов MySQL есть конструкция, позволяющая определить дату последнего обновления таблицы. Для чего это может быть полезно? Мне, например, понадобилось при построении системы “умного кеширования”. Также это может быть востребованным при том или ином виде сбора данных из сети с последующим сохранением данных в заданной таблице.

Итак, посредством следующего запроса мы можем получить как дату последнего обновления таблицы MySQL (столбец Update_time), так и ряд ее других свойств:

 mysql> SHOW TABLE STATUS LIKE 'positions'\G;
*************************** 1. row ***************************
           Name: positions
         Engine: MyISAM
        Version: 10
     Row_format: Dynamic
           Rows: 395
 Avg_row_length: 203
    Data_length: 80512
Max_data_length: 281474976710655
   Index_length: 9216
      Data_free: 0
 AUTO_INCREMENT: 454
    Create_time: 2009-01-19 16:29:27
    Update_time: 2009-01-20 11:12:12
     Check_time: NULL
      Collation: latin1_swedish_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row IN SET (0.00 sec)

P.S. Люди еще умудряются этим запросом LAST_INSERT_ID брать, вместо того, чтобы написать SELECT LAST_INSERT_ID() :).

См. также:
Повозимся с NULL-полями таблиц!
SELECT HIGH_PRIORITY…
VARCHAR, VARCHAR…

Рубрики: Конструкции языка, Разное | Комментариев нет »