26.02.09 11:51GROUP BY и ORDER BY NULL

Не все знают, что MySQL по умолчанию упорядочивает результаты запроса по полям в GROUP BY. Это значит, что возможно использование filesort и других затратных операций сортировки.

В данном запросе используется filesort:

MySQL:
  1. world@localhost>EXPLAIN SELECT CountryCode, Name FROM City GROUP BY CountryCode LIMIT 10;
  2. +----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+
  3. | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                           |
  4. +----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+
  5. 1 | SIMPLE      | City  | ALL  | NULL          | NULL | NULL    | NULL | 4079 | USING temporary; USING filesort |
  6. +----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+
  7. 1 row in SET (0.00 sec)

Читать дальше...

Комментариев нет | Рубрики: MySQL, performance

25.02.09 13:40How to: Отмена запроса в консольном клиенте mysql

Приходилось ли вам заново соединяться с базой после того как нажали 'CTRL+C' в надежде отменить неправильно набранный запрос? Неудобно? Да. Особенно если вы использовали временные таблицы или переменные, которые потеряются после реконекта.
Читать дальше...

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

25.02.09 12:15PHP 5.3: ext/mysqli – Persistent Connections

Начиная с PHP 5.3 расширение mysqli поддерживает постоянное соединение с базой данной. (К слову, в расширениях mysql и PDO уже давно есть)
Для сброса соединения в исходное, "чистое", состояние mysqli использует функцию mysql_change_user().
Хорошая новость: Читать дальше...

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

11.02.09 11:56Jet Profiler for MySQL 1.0

Вышел публичный релиз профайлера Jet Profiler для MySQL.

Jet Profiler for MySQL

Из заявленных возможностей:
Читать дальше...

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

10.02.09 18:33Linux Swappiness

Когда-нибудь приходилось сталкиваться с через-мерным свопом в линуксе? Особенно при больших значениях innodb_buffer_pool_size. Посмотрим что у нас с памятью:

CODE:
  1. :~$ free
  2. total used free shared buffers cached
  3. Mem: 2041888 1991096 50792 0 52 954592
  4. -/+ buffers/cache: 1036452 1005436
  5. Swap: 975200 1308 973892

У нас еще есть 50792 + 52 + 954592 = 1005436кб свободной памяти, а система уже начинает свопится. И вот в чем причина:
Читать дальше...

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

17.12.08 16:03Facebook опубликовал свою модификацию memcached

Facebook открыл свои изменения для системы кеширования данных memcached. Согласно заметке удалось поднять количество ежесекундно обрабатываемых запросов до 300 тысяч. В настоящий момент вычислительные мощности Facebook насчитывают порядка 800 серверов с суммарным объемом оперативной памяти 28TB.
Исходный код модификации доступен в git репозитории http://github.com/fbmarc/facebook-memcached/tree/master

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

10.11.08 10:48How to: Логирование mysql на стороне клиента

Среди поддерживаемых опций консольного клиента mysql есть опция -tee.
Задав -tee=/path/to/file.log в аргументах клиента вы получите полное логирование всего, что пишется в и печатается из клиента.

Кроме того можно поместить tee=/logs/mysql.log в секцию "mysql" в файле my.cnf для автоматического включения логирования при старте клиента.
Или непосредственно из клиента:

mysql> tee /path/to/file.log
Logging to file '/path/to/file.log'
mysql> notee
Outfile disabled.

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

03.10.08 12:54Расширенный EXPLAIN

В MySQL 4.1 была добавлена такая замечательная вещь для EXPLAIN как ключевое слово EXTENDED, позволяющее получить дополнительную информацию по оптимизации запроса.
Читать дальше...

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

20.09.08 18:07COUNT(*) для InnoDB таблиц

При переходе от MyISAM к Innodb, стоит помнить, что Innodb крайне медлителен в  COUNT(*) запросах.

Следовательно, если у вас есть запросы вида SELECT COUNT(*) FROM t1 они будут выполняться значительно быстрее для MyISAM таблиц так как достаточно вернуть сохраненное количество записей. InnoDB в данном случае вынужден будет выполнить полно-табличное/индексное сканирование, потому, что он не имеет подобного счетчика. И одним простым счетчиком в данном случае не обойтись, ведь каждая транзакция может видеть разное количество записей в таблице.

Запросы вида SELECT COUNT(*) FROM t1 WHERE id = 9  выполняются примерно одинаково для MyISAM и InnoDB таблиц, сканированием диапозона индексов.

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

Вывод: InnoDB медленней не для всех запросов вида COUNT(*), а только для случаев без условия WHERE.

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

20.09.08 14:18Настройки MySQL Server

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

Читать дальше...

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