Archive for the ‘Базы данных’ Category

Профайлинг для MySQL и стоимость запросов (query cost)

Thursday, April 29th, 2010

Очень интересная заметка про профайлинг MySQL запросов.

http://dev.mysql.com/tech-resources/articles/using-new-query-profiler.html

Стоимость запросов (query cost)

mysql> SELECT SQL_NO_CACHE COUNT(*) FROM db_name.table_name;
+----------+
| count(*) |
+----------+
| 5462 |
+----------+
mysql> SHOW STATUS LIKE 'last_query_cost';
+-----------------+-------------+
| Variable_name | Value |
+-----------------+-------------+
| Last_query_cost | 1040.599000 |
+-----------------+-------------+

myisamchk

Wednesday, June 24th, 2009

Проверка и исправление ошибок в MyIsam базах.

mysql/db # myisamchk --silent --force --fast --update-state -O key_buffer=64M -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M ./*/*.MYI

На время проверки mysqld лучше остановить, или делать проверку через REPAIR из mysql монитора.

Выборка дат из mysql в нормальном виде

Saturday, April 18th, 2009
SELECT CONCAT( IF(10>DAY(date),"0",""),DAY(date),".",IF(10>MONTH(date),"0",""),MONTH(date)) as date
FROM table_name

где поле date — это дата в mysql-вском формате

и такое бывает

Saturday, October 4th, 2008

Кто перегрузил базу на mail.ru? Больше не перегружайте. :)

mysql: сравнение с NULL

Friday, September 19th, 2008

Чтобы выбрать значения которые равны\не равны NULL ошибочно писать WHERE field = 'NULL' или WHERE field = NULL.

Правильные запросы:

SELECT field1, field2 FROM table WHERE field1 IS NULL;

SELECT field1, field2 FROM table WHERE field1 IS NOT NULL;

mysql полезности

Friday, September 5th, 2008
  • Показать выражение для создания таблицы
    SHOW CREATE TABLE название_таблицы;
  • Вывести описания таблиц
    SHOW TABLE STATUS

Оптимизация mysql

Wednesday, May 21st, 2008

Если из выборки необходимо извлечь лишь несколько строк, нужно использовать

LIMIT число_выборок

Это особенно касается запросов вида

SELECT id, item FROM table_name WHERE id = 'some_id' LIMIT 1

Использование конструкции LIMIT позволит сократить время запроса, так как маська успокоится сразу как только достанет указанное количество совпадений и не будет потрошить базу до самого конца.

После добавлении в таблицу большого количества новых записей полезно выполнить комманду

OPTIMIZE TABLE table_name

MySQL выполнит оптимизацию структуры таблицы, дефрагментирует её.

Если нужно пихать в базу большое количество данных за короткое время, чтобы база не захлебывалась можно делать отложенные запросы

INSERT DELAYED ...

Это работает только для таблиц ISAM и MyISAM

Резервное копирование таблиц mysql

Wednesday, May 21st, 2008

Бекап таблицы:

BACKUP TABLE имя_таблицы TO '/dir'

Помним про песочницу.
Восстановление:

RESTORE TABLE имя_таблицы FROM '/path/to/file'

Сохранение результата выборки mysql в файл

Wednesday, May 21st, 2008

MySQL поддерживает возможность сохранения запроса в файл.

SELECT ... INTO OUTFILE '/path/to/file'

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

LOAD DATA INFILE '/path/to/filename' INTO TABLE table_name

файл должен существовать :)

Бекап базы данных mysql

Monday, April 21st, 2008

Для бекапа (дампа) базы данных mysql удобно использовать утилиту mysqldump:

$ mysqldump имя_базы имя_таблицы > название_файла.sql -u имя_пользователя -p

Где имя_базы это название базы данных, имя_таблицы это название таблицы, название_файла.sql это файл в который делается бекап, имя_пользователя - имя пользователя, имеющего доступ как минимум на чтение к это базе и таблице.

Чтобы загрузить этот бекап обратно в базу данных из файла:

$ mysql -u имя_пользователя -p -D имя_базы < название_файла.sql

Когда утилита mysqldump делает бекап, она не ставит директиву какую базу данных использовать, поэтому при загрузке этого бекапа обратно в mysql следует либо указать эту директиву в файле

USE имя_базы

(Это следует поместить куда-нибудь в начало файла, до других комманд)

Либо использовать параметр -D имя_базы при использовании комманды mysql при загрузке дампа.