|
|
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
Доброго дня, буду очень признателен если вы мне поможете в оптимизации MySQL. [!!] Query cache efficiency: 1.5% (15K cached / 999K selects) Я правильно понимаю, всего лишь 1.5% из всех запросов кешируются? Подскажите пожалуйста от каких параметров зависит кеширование запросов? Каким образом можно выяснить почему такой низкий показатель кеширования? [!!] Joins performed without indexes: 3122 Выходит что у меня слишком много запросов которые выполняются без индекса. Можно ли как то логировать запросы которые выполняются без индекса? [OK] InnoDB data size / buffer pool: 1.2G/2.0G Размер базы данных 1.2G, а размер буфера 2.0G? Разве буфер это не то место где кешируются запросы? [--] Reads / Writes: 99% / 1% Большинство запросов у меня на чтение, поэтому можно смело ставить индексы на все возможные поля используемые в запросах-выборках. [--] Total buffers: 5.3G global + 2.0G per thread (151 max threads) [!!] Maximum possible memory usage: 307.7G (1976% of installed RAM) Кол-во тредов я ручками не увеличивал, но интуиция подсказывает что это слишком большое значение для max_connections, так как Max_used_connections = 25 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 14:32:12 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
у тя проблемы какие или так, любопытства ради? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 14:52:27 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
Inside22[!!] Query cache efficiency: 1.5% (15K cached / 999K selects) Я правильно понимаю, всего лишь 1.5% из всех запросов кешируются? Подскажите пожалуйста от каких параметров зависит кеширование запросов? Каким образом можно выяснить почему такой низкий показатель кеширования?Понимаете правильно. Варианты могут быть разные. Наиболее вероятный - мал кэш запросов. А еще не все запросы в принципе могут кэшироваться. Например, те, которые используют текущую дату/время, случайные числа, гуиды и т.п.Inside22[!!] Joins performed without indexes: 3122 Выходит что у меня слишком много запросов которые выполняются без индекса. Можно ли как то логировать запросы которые выполняются без индекса?См. в доке Slow log, там есть опция, которая позволяет кэшировать запросы без применения индексов. Однако сами по себе таки запросы не являются автоматически плохими, с ними надо разбираться.Inside22[OK] InnoDB data size / buffer pool: 1.2G/2.0G Размер базы данных 1.2G, а размер буфера 2.0G? Разве буфер это не то место где кешируются запросы?Нет, это кэш таблиц и индесов InnoDB. Кэш запросов - это query_cache_size Inside22[--] Total buffers: 5.3G global + 2.0G per thread (151 max threads) [!!] Maximum possible memory usage: 307.7G (1976% of installed RAM)2.0G per thread - это очень много, почти наверняка сильно избыточно. Почитайте http://dev.mysql.com/doc/refman/5.5/en/memory-use.html Там в т.ч. расписано, какие буфера выделяются на сессию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 15:45:33 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
Inside22, First of all every time you ask questions write MySQL version and Platform. 1. [!!] Query cache efficiency: 1.5% So it indicates that your data and queries changes frequently that q_cache simple cant cache your selects. or your select dont use q_cache I advice just disable query_cache permanently: Код: sql 1. 2. 3. 2. [!!] Joins performed without indexes: 3122 You can enable slow_query_log with logging queries that dont use indexes. Write into my.cnf under [mysqld] catalog: Код: sql 1. 2. 3. 4. But it is very memory consuming process. because your slow log may grow very large. Just run MySQL for a 3 hours eg. to log queries then disable this feature. log_queries_not_using_indexes = 0 3. Разве буфер это не то место где кешируются запросы? NO. Read documentation for innodb_buffer_pool: InnoDB Buffer Pool InnoDB maintains a storage area called the buffer pool for caching data and indexes in memory 4. WOW 2.0G per thread??!! Something going wrong here. 151x2G=302G 302G+5.3G~~307.3 G = 1976% of installed RAM :D It must be 2.2 or 2.8 MB per thread. Your per-session variables must be given too large it is very dangerous: Check out them: Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 15:48:38 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
miksoft, sorry i dont refresh page while writing comment. You have already answered ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 15:49:45 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
Shahriyar.Rmiksoft, sorry i dont refresh page while writing comment. You have already answered ;)Ничего страшного. Ваш ответ содержит несколько другой взгляд на вещи, так что это только приветствуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 15:51:07 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
miksoft, Thumbs up! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 15:57:09 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
Shahriyar.R. Your per-session variables must be given too large it is very dangerous: На самом деле нет. очень редки случаи когда все буфера используются на 100%. В реальности нужно мониторить фактическое среднее потребление памяти mysql-ем, а не бросаться в панику от дебильных советов mysqltuner ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 16:34:46 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
netwind, there is really a big reason to panic. you should not touch per-session variables untill the query really needs it. From High Perfomance MySQL 3rd edition book page 336 chapter 8: 1. read_buffer_size MySQL doesn’t allocate any memory for this buffer until a query needs it, but then it immediately allocates the entire chunk of memory specified here. 2. read_rnd_buffer_size MySQL doesn’t allocate any memory for this buffer until a query needs it, and then it allocates only as much memory as needed. (The name max_read_rnd _buffer_size would describe this variable more accurately.) 3. sort_buffer_size MySQL doesn’t allocate any memory for this buffer until a query needs to do a sort. However, when there’s a sort, MySQL allocates the entire chunk of memory immediately, whether the full size is required or not. You should not raise the value of a per-connection setting globally unless you know it’s the right thing to do. Some buffers are allocated all at once, even if they’re not needed, so a large global setting can be a huge waste. Instead, you can raise the value when a query needs it. The most common example of a variable that you should probably keep small and raise only for certain queries is sort_buffer_size, which controls how large the sort buffer should be for filesorts. MySQL performs some work to initialize the sort buffer after allocating it. In addition, the sort buffer is allocated to its full size even for very small sorts, so if you make it much larger than the average sort requires, you’ll be wasting memory and adding allocation cost. In summary, a large sort buffer can be very expensive, so don’t increase its size unless you know it’s needed. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 16:57:25 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
Shahriyar.R, раз уж в этой в книге не обсуждается вероятность одновременного использования всех трех типов буферов сразу во всех потоках, не вижу оснований приводить тут цитатки в качестве аргументации. В стандартном использовании mysql для веб максимальное число соединений определяется не на основе max_connections, а на лимитах веб-сервера. Я посмотрел код и вижу, что скрипт определяет планку исключительно из max_connections. И ТС даже привел данные по фактической планке : авторКол-во тредов я ручками не увеличивал, но интуиция подсказывает что это слишком большое значение для max_connections, так как Max_used_connections = 25 так что паника скорее не нужна. Нужен мониторинг. Кстати, с tmp_table_size и max_heap_table_size не понятно. Несмотря на очевидное использование этих переменных per-thread, планка начала паники должна бы снизиться еще ниже, однако судя по коду, авторы скрипта решили не использовать их для прогноза. Ну что за бардак ? Где единообразие? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 17:33:09 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
miksoftкоторая позволяет кэшировать запросы без применения индексов"логировать" же :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 17:38:51 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
tanglirmiksoftкоторая позволяет кэшировать запросы без применения индексов"логировать" же :)Да, сорри. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 17:39:44 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
miksoft, спасибо большое за дельные советы. Shahriyar.R, thank you for advice. Cox maraqlı bloqunuz vardır. База работает, по большому счету проблем нету, но есть запросы которые выполняются по 1-4 секунды. К примеру есть у меня один очень странный пример: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Это все выполняется в течении 3 секунд. Каждый же запрос по отдельности выполняется в течении 0,15 секунд. Я первый раз сталкиваюсь с таким явлением. После этого я увеличил нижеперечисленные параметры согласно советам MYSQLTUNER.PL, после этого 3-х секундный запрос начал выполнятся за 0,15 секунд, но только со второго раза. После рестарта ДБ первый раз запрос выполняется все равно по 3 секунды. Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 18:02:45 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
Inside22К примеру есть у меня один очень странный пример: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Это все выполняется в течении 3 секунд. Каждый же запрос по отдельности выполняется в течении 0,15 секунд. Я первый раз сталкиваюсь с таким явлением.А я вот не первый. И встречались ситуации, когда единственным действенным вариантом было переделывать клиентское приложение так, чтобы оно последовательно вызвало четыре запроса по-отдельности. Inside22после этого 3-х секундный запрос начал выполнятся за 0,15 секунд, но только со второго раза. После рестарта ДБ первый раз запрос выполняется все равно по 3 секунды.Само по себе это логично, разнообразные кэши должны наполниться, прежде чем начать работать эффективно. Inside22 Код: php 1. 2. Не понял, вы одновременно используете оба типа таблиц? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 18:09:59 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
Сервер достаточно мощный CentoS 6 MySQL 5.5.30 2 процессора Intel Xeon E5620 @ 2.40GHz (Cores 4, Threads 8) Hard disks4x300GB SAS 15k RAM 16GB ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 18:14:10 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
Inside22RAM 16GBА, так вот почему вы так вольно память раздаете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 18:15:03 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
Inside22увеличил нижеперечисленные параметры согласно советам MYSQLTUNER.PL, ... запрос выполняется все равно по 3 секунды. А ну вот тут и стоило задуматься, зачем вообще лезть мучать параметры, если их изменения ни к чему не привели? Может нужно позвать программиста? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 18:15:57 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
miksoft[А я вот не первый. И встречались ситуации, когда единственным действенным вариантом было переделывать клиентское приложение так, чтобы оно последовательно вызвало четыре запроса по-отдельности. Раз уж у нас топик армянского английского, процитируем золотые бессмертные строки Schwartz B., Zaitsev P., Tkachenko V. - High Performance MySQL, 3rd Edition It’s usually better to configure the basic settings correctly (and there are only a few that really matter in most cases) and spend more time on schema optimization, indexes, and query design. After you’ve set MySQL’s basic configuration options correctly, the potential gains from further changes are usually small . В русской редакции второго издания этот абзац - полнейшая безысходность: Возможно, вы заметите, что некоторый запрос выполняется медленно, и сумеете улучшить его, подправив один-два параметра, но заставить сервер работать на порядок быстрее удается крайне редко . Чтобы достичь такого результата, обычно приходится пересматривать схему, запросы и всю архитектуру приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 18:17:21 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
miksoftСамо по себе это логично, разнообразные кэши должны наполниться, прежде чем начать работать эффективно. Ничего себе. Не знал и ни когда не сталкивался с таким явлением. Странно очень, получается что MySQL сам не может выполнить 4 запроса и объедить? Интересно, с чем связано такое резкое увеличение времени? Есть ли этому какое то логическое объяснение? miksoftInside22 Код: php 1. 2. Не понял, вы одновременно используете оба типа таблиц? key_buffer_size=2048M это пережитки оставшиеся с момента установки на сервер MySQL. База данных у нас InnoDB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 18:18:10 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
Inside22Странно очень, получается что MySQL сам не может выполнить 4 запроса и объедить? Интересно, с чем связано такое резкое увеличение времени? Есть ли этому какое то логическое объяснение?Думаю, это связано с материализацией подзапросов... во всяком случае не раз сталкивался, когда UNION ALL нескольких быстрых объёмных запросов из однотипных пухлых таблиц даёт немеряные тормоза - и зачастую формирование MERGE-надтаблицы снимает проблему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 18:25:50 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
Inside22miksoftСамо по себе это логично, разнообразные кэши должны наполниться, прежде чем начать работать эффективно.Ничего себе. Не знал и ни когда не сталкивался с таким явлением.Это общее свойство всех (не только в СУБД) кэшей при операциях чтения. Inside22Странно очень, получается что MySQL сам не может выполнить 4 запроса и объедить? Интересно, с чем связано такое резкое увеличение времени? Есть ли этому какое то логическое объяснение?Могу (глядя в потолок) предположить, что MySQL пытается разместить весь результирующий набор в памяти, которой не хватает, в результате чего выборка уезжает на диск. Но детально я этот вопрос не исследовал, могу и ошибаться. Inside22key_buffer_size=2048M это пережитки оставшиеся с момента установки на сервер MySQL. База данных у нас InnoDB.Ну так сократите key_buffer_size до, например, 64М. Если объектов (таблиц) в БД очень много, то, возможно, понадобится немного побольше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 18:31:47 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
miksoftМогу (глядя в потолок) предположить, что MySQL пытается разместить весь результирующий набор в памяти, которой не хватает, в результате чего выборка уезжает на диск.Скорее всего так. Причём уезжает она туда ВСЯ, а не только непоместившийся в мозгах шмот. И отдаётся на клиента она тоже ВСЯ с диска. И ещё - если такая фигня произошла, результаты этого запроса искать в кэше бессмысленно, второй раз всё повторится с самого начала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 18:58:21 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
Inside22, Here is What i found from your my.cnf as misconfiguration: * max_allowed_packet=2048M value is very high. in my production server i gave this value only 16M * key_buffer_size=2048M if your tables primarily InnoDB why use 2G myisam key buffer?. also in my server i put this value only 16M * myisam_sort_buffer_size=1024M . the default value for this variable is only 8M and let it be as default. * innodb_additional_mem_pool_size=1024M is too high again. Maybe the 20M will be better for this variable. But if you want exaclty optimize this value. You can check and find optimal value as : Код: sql 1. 2. 3. 4. 5. 6. 7. 25-30% more than the value from "in additional pool allocated" But i dont think that it is very important at this moment. * innodb_buffer_pool_size=2G too low. if you have Centos with 16G with InnoDB why you dont give for eg 10G to innodb_buffer? * join_buffer_size=256M what kind of join will use 256M? do not touch per-session variables instead of try to do first of all query optimization with proper indexing techniques. So i suggest to delete this from my.cnf You can read about join_buffer_size from What is join buffer? If to give large value to this variable you will likely see following bug/error: Join buffer allocation fails silently *автор после этого 3-х секундный запрос начал выполнятся за 0,15 секунд, но только со второго раза. После рестарта ДБ первый раз запрос выполняется все равно по 3 секунды. Maybe it is because of your query_cache so i advice to disable query_cache enable slow_query_log run for a while and check the slow query log with a tool from percona toolkit pt-query-digest. If problem exists and you can not solve open new topic with your slow query. experts surely will help. The main question of this topic , i think is answered. the pros-cons of variables observed by experts such miksoft , Akina , netwind So dear Inside22 read all comments take your notes. I think that was the best discussion in forum that i participate it is really great pleasure to be with you ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 19:20:40 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
Akina, Ежели слегка вспомнить что всё крутится на банальном Фон Неймане, то медленное исполнение union и даже all - ничегшо удивительного не содержит. Это "дорогая" операция для него. Надо последовательно выбрать данные в 4 временных буфера, а потом(!) собрать всё вместе в один буфер перебирая буфера позаписно... а потом(!) результат отдать клиенту. Объем временных данных, опять же сильно зависит от количества выбираемых столбцов (ширины), а не токмо строк. .. и вот тут, для временных буферов может оказаться недостаточно памяти и они полезут на диск (как правило, внезапно и неожиданно: работало вроде же! угу... пока объем выборки был мал) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2013, 06:40:26 |
|
||
|
Оптимизация MySQL по результатам mysqltuner.pl
|
|||
|---|---|---|---|
|
#18+
Есть лог медленных запросов, есть лог запросов которые не используют индексы... Почему нету лога запросов которые задействуют диск? Ну или хотябы расширеного EXPLAIN который бы показал что и насколько задействовалось при выполнении запроса? (сколько и в каких буферах/дисках занял места) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2013, 21:11:42 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38265069&tid=1835579]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
84ms |
get tp. blocked users: |
1ms |
| others: | 192ms |
| total: | 350ms |

| 0 / 0 |
