05.05.2009 от
nikolay
Один из способов - сделать UNIQUE-индекс по тем полям, сочетание которых должно быть уникальным в пределах таблицы. Другой способ, подходящий именно для больших таблиц, - “пройтись” скриптом по таблице и, выбрав первичные ключи на удаление, удалить их. Есть еще варианты с временной таблицей, но, имхо, это неудачное решение для больших таблиц.
См. также:
Как удалить бинарные логи сервера MySQL?
Типы таблиц MySQL
Не используйте SELECT * FROM
Рубрики: Разное |
Комментариев нет »
05.05.2009 от
nikolay
В базе данных можно хранить особо важный данные и в закрытом зашифрованном виде. Например, при помощи функций DES_ENCRYPT и DES_DESCRYPT. В этом случае данные шифруются при помощи алгоритма Triple-DES. Правда, для работы с этими функциями MySQL должен быть собранным с поддержкой SSL. Используются эти функции следующим образом:
DES_ENCRYPT('строка для шифрования', 'ключ')
DES_DECRYPT('зашифрованная строка', 'ключ')
См. также:
Шифрование данных в MySQL
VARCHAR, VARCHAR…
Упаковка/распаковка данных в таблицах
Рубрики: Разное |
Комментариев нет »
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
Создание новой таблицы по образу и подобию уже существующей
Рубрики: Утилиты, Разное |
Комментариев нет »
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
Рубрики: Разное |
Комментариев нет »
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
Рубрики: Новости, Разное |
Комментариев нет »
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
Рубрики: Настройки, Разное |
Комментариев нет »
08.04.2009 от
nikolay
Иногда нужно увеличить параметр max_allowed_packet временно, для конкретного приложения, работающего с MySQL. В этом случае удобно воспользоваться следующим запросом:
SET max_allowed_packet = 1500000;
Таким образом, мы можем временно для конкретной сессии менять значения данного параметра.
См. также:
LAST_INSERT_ID и его параметр
DES_ENCRYPT и DES_DECRYPT
Вывод результатов запроса по вертикали в консоли 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 :)
Рубрики: Конструкции языка, Разное |
Комментариев нет »
01.04.2009 от
nikolay
Если вы планируете работать с MySQL в кодировке UTF-8 (обычно это нужно когда и сайт будет в соответствующей кодировке), то вам нужно знать несколько особенностей по работе с БД:
- После подключения к БД из скриптов первым обязательно выполните запрос SET NAMES UTF8
- У самой БД, всех ее таблицах и полях должна быть указана кодировка и сравнение utf8_general_ci
См. также:
Кодировки, кодировки, кодировки…
Пара слов о полнотекстовом поиске
DES_ENCRYPT и DES_DECRYPT
Рубрики: Разное |
Комментариев нет »
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…
Рубрики: Разное, Производительность |
Комментариев нет »
01.04.2009 от
nikolay
В 6-й версии MySQL появился новый служебный запрос - SHOW CONTRIBUTORS, выводящий таблицу с информацией о людях, которые вносят вклад в развитие MySQL или осуществляют поддержку компании MySQL AB. Для каждого лица отображается имя, местоположение и комментарий.
См. также:
Вывод доступных таблиц текущей базы данных MySQL
Разработчики MySQL… Кто они?
Вывод доступных баз данных MySQL
Рубрики: Разное |
Комментариев нет »
25.03.2009 от
nikolay
Опция SQL_SMALL_RESULT использовуется с конструкциями GROUP BY и DISTINCT в тех случаях когда необходимо указать MySQL что результат запроса будет содержать мало строк. В этом случае MySQL использует быстрые временные таблицы и не сортирует данные во временнных таблицах.
См. также:
SELECT SQL_BIG_RESULT…
Повозимся с NULL-полями таблиц!
Быстрая справка по 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
Рубрики: Разное, Производительность |
Комментариев нет »
25.03.2009 от
nikolay
Настраивая MySQL или преобразовывая кодировку БД часто требуется знать как пишется название той или иной кодировки. Доступные кодировки в MySQL можно поглядеть специальным служебным SQL-запросом вида:
См. также:
Повозимся с NULL-полями таблиц!
Кодировки, кодировки, кодировки…
Конструкция SELECT SQL_NO_CACHE…
Рубрики: Конструкции языка, Разное |
Комментариев нет »
18.03.2009 от
nikolay
Если вы получили от MySQL сообщение об ошибке №28, то не пугайтесь, проблема банальная - на жестком диске кончилось место и нужно всего лишь освободить какую-то часть и перезапустить MySQL. Вчера потратил пару часов, пока разобрался с аналогичной проблемой у себя на сервере.
См. также:
Функция UUID()
Свой ORDER BY
Опция SQL_BUFFER_RESULTS
Рубрики: Разное, Производительность |
Комментариев нет »
18.03.2009 от
nikolay
Конструкция SELECT HIGH_PRIORITY полезна в тех случаях, когда команде выборки данных нужно дать максимально высокий приоритет над командами обновления и изменения таблицы. На обычных сайтах данные меняются не так часто, чтобы указывать подобные приоритеты, но в ряде веб-сервисов вполне может применяться.
См. также:
Быстрая справка по MySQL :)
Повозимся с NULL-полями таблиц!
Конструкция SELECT … WITH ROLLUP
Рубрики: Конструкции языка, Разное |
Комментариев нет »
18.03.2009 от
nikolay
Буквально только что узнал о том, что у MySQL (при запуске из командной строки) есть опция i-am-a-dummy, являющаяся псевдонимом safe-updates. Надеюсь дословный перевод первой опции понятен. Перевод и предназначение второй - защита от случаных изменений. Думаю, что вольным переводом i-am-dummy можно считать фразу «защита от дурака».
См. также:
Пара слов о полнотекстовом поиске
Кодировки, кодировки, кодировки…
Конструкция SELECT SQL_NO_CACHE…
Рубрики: Разное |
Комментариев нет »
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…
Создание новой таблицы по образу и подобию уже существующей
Рубрики: Конструкции языка, Разное |
Комментариев нет »
11.03.2009 от
nikolay
А вы знали, что в MYSQL можно легко сгенерировать UUID (он же GUID и просто UID)? Речь идет о случайной генерации 128 битного числа представленного в формате “aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee”. Генерируется такое число вот так:
Стоит заметить, что тире, разделяют части универсального идентификатора:
- первые три части генерируются по метке времени;
- четвертая часть сохраняет в некоторой степеи уникальность в том случае, если временя теряет свою монотонность (например, из-за перевода часов на летнее время);
- пятая часть генерируется в 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-полями таблиц!
Рубрики: Конструкции языка, Разное |
Комментариев нет »
03.03.2009 от
nikolay
Название текущей базы данных 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
Рубрики: Конструкции языка, Разное |
Комментариев нет »
25.02.2009 от
nikolay
Для получения списка доступных баз данных на сервере MySQL для текущей учетной записи достаточно выполнить команду SHOW DATABASES.
См. также:
Вывод доступных таблиц текущей базы данных 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
Рубрики: Разное |
Комментариев нет »
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
Рубрики: Конструкции языка, Разное |
Комментариев нет »
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
Получение данных о стуктуре таблицы
Рубрики: Конструкции языка, Разное |
Комментариев нет »
25.02.2009 от
nikolay
А вы знали, что начиная с версии 5.0.12 запросы в MySQL могут “спать”?
Как? Да очень просто… так, например, запрос
сделает паузу в исполнении на 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 символа. Но это еще не все, после изменения опции нужно:
- перезапустить MySQL-сервер
- выполнить для таблицы с полнотекстовым индексом команду 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?
Рубрики: Настройки, Разное |
Комментариев нет »
17.02.2009 от
nikolay
А вы замечали, что LIKE обычно регистронезависим? А знаете как его отучить от этого дела? А очень просто, нужно всего лишь записывать этот оператор в виде:
SELECT * FROM texts WHERE name LIKE BINARY '%бла%'
См. также:
Повозимся с NULL-полями таблиц!
Конструкция SELECT SQL_NO_CACHE…
Для чего нужен STRAIGHT JOIN?
Рубрики: Конструкции языка, Разное |
Комментариев нет »
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
Для получения данных о структуре заданной таблицы существует специальная конструкция вида
позволяющая узнать подробную информацию о каждом из столбцов таблицы - тип поля, null, тип индекса и дефолтное значение.
См. также:
Повозимся с NULL-полями таблиц!
Статистика MySQL сервера
Дата последнего обновления таблицы
Рубрики: Конструкции языка, Разное |
Комментариев нет »
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
Рубрики: Конструкции языка, Разное, Производительность |
Комментариев нет »
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-полями таблиц!
Рубрики: Конструкции языка, Разное |
Комментариев нет »
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?
Рубрики: Конструкции языка, Разное, Производительность |
Комментариев нет »
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…
Рубрики: Конструкции языка, Разное |
Комментариев нет »