Рубрика: "MySQL"
Настройка и оптимизация MySQL сервера
В этой статье будут описаны различные настройки MySQL, преимущественно те, которые влияют на производительность. Для удобства все переменные разделены по разделам (базовые настройки, ограничения, настройки потоки, кэширование запросов, тайминги, буферы, InnoDB). Сначала уточним имена некоторых переменных, которые изменились в версии 4 MySQL, а в сети продолжают встречаться и старые и новые варианты имен, что вызывает вопросы.
MYSQL, работа со строками при помощи SUBSTRING_INDEX
Функция MySQL SUBSTRING_INDEX(str,delim,count) позволяет выбирать определенные участки строк в SQL-запросах. В параметрах передается:
- str – обрабатываемая строка,
- delim – разделитель частей,
- count – количество выбираемых частей.
Пример:
SUBSTRING_INDEX('www.example.com', '.', 2)
В данном случае функция вернет 'www.example', т.е. строка будет разбита на части, разделенные '.' и будут взяты две части.
SUBSTRING_INDEX('www.example.com', '.', -2)
Вернет 'example.com', аналогично примеру выше, но будут взяты две части с конца строки.
Но все вышеописанное можно найти в мануале MySQL. А вот примера, как взять одну часть из середины строки – нет. И хоть в этом не ничего сложного, но приведу его в качестве шпаргалки:
SUBSTRING_INDEX(SUBSTRING_INDEX('www.example.com', '.', 2), '.', -1)
Тут функция вернет 'example'. Сначала будет выполнен вложенный запрос, который вернет 'www.example', а затем основной запрос, который и вернет 'example'.
Все
MySQL, profiling
Профайлинг - еще одна удобная штука в MySQL. Доступна с версии 5.0.37. Вот как это выглядит:
MySQL, found_rows()
Удобная функция в том случае, если надо получить лишь несколько строк из таблицы, но интересно общее число записей.
FOUND_ROWS()
Возвращает количество строк, которые возвратила бы последняя команда SELECT SQL_CALC_FOUND_ROWS ... при отсутствии ограничения оператором LIMIT.
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();
Второй вызов команды SELECT возвратит количество строк, которые возвратила бы первая команда SELECT, если бы она была написана без выражения LIMIT. Отметим, что, хотя при использовании команды SELECT SQL_CALC_FOUND_ROWS ..., MySQL должен пересчитать все строки в наборе результатов, этот способ все равно быстрее, чем без LIMIT, так как не требуется посылать результат клиенту.
Функция SQL_CALC_FOUND_ROWS появилась в MySQL 4.0.0.
MySQL, вложенные запросы и group_concat
Недавно, в ходе работы над одним веб-проектом заметил, что один SELECT запрос весьма долго выполняется. Начал разбираться. Там используется конструкция вида SELECT * FROM table1 WHERE foo='bar' AND id IN (SELECT id FROM table2 WHERE foo2='bar2'). Причем сам по вложенный запрос выполняется быстро. Если вместо вложенного запроса подставить список идентификаторов через запятую, то он также выполняется быстро.