|
|
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Недавно создавал тему http://www.sql.ru/forum/1303095-1/skorost-vypolneniya-zaprosa-bolshaya-tablica , где выяснил как лучше построить таблицу и оптимизировать скорость. Результат был достигнут. Сейчас на сервере 2 основные использующиеся таблицы с одинаковой структурой и данными (разница только в названиях таблиц) В таблице #1 214млн строк, ее вес 40ГБ (из них 25гб индексы) В таблице #2 26млн строк, ее вес 5.5ГБ (из них 3.5гб индексы) Первая проблема. Работает все как самолет ровно до того момента, как не очистишь кеш памяти, либо не перезагрузишь сервер. Стоит дебиан. Я так понимаю, что MySQL хранит индексы в памяти и берет ее под кеш. Потому что после некоторых манипуляций выборка сразу начинает летать. Какие манипуляции нужно сделать, чтобы сервер полетел: Если выполнить дубликат таблицы #1, то во время его выполнения я так понимаю происходит операция чтения и в этот же момент кешируется в память информация. Вот скрин free -m в момент старта дубликата таблицы. Код: powershell 1. 2. 3. 4. 5. Вот, когда идентичная таблица таблице #1 создана. Код: powershell 1. 2. 3. 4. 5. Сожрало 50ГБ оперативной памяти под кеш. Выполнение запроса до дубликата таблицы 105 секунд: Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. А сразу после того, как завершен был дубликат - аналогичный запрос выполняется 0.2 секунды. И все похожие так же. (Кеш самих SQL запросов отключен). Так же заметил ту же ситуацию с репейр. Если делать репейр таблицы, то после репейра она сразу бешенная, если память на сервере без кеша и репейр не делать, то GGWP как говорится, будешь ждать на каждый запрос миллион лет. У меня будет таких таблиц по 50гб еще 4-5. На сервере сейчас SSHD диск. Думаю взять сервер с NVMe, чтобы ускорить работу масика раз в 5. Но мне все равно тупо не хватит оперативной памяти. Сейчас оперативки на сервере 128гб. Помимо этого проекта на сервере есть еще один. На который выделено 50. Остальное я бахнул для масика этого проекта. Вопрос: как быть в таком случае? Можно ли обработку и хранение этой информации в памяти как-то перенести на диск, или будет медленнее? Использую MyISAM а не InnoDB , т.к. на сайте только выборка и инсерты. Иннодб в 20 раз медленнее, проверял на домашней машине тоже с M.2 диском. P.S. вот мой конфиг масика , который 100% я настроил криво. Код: powershell 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. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2018, 19:27 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
8POWER-Иннодб в 20 раз медленнееНе верю. В 2 раза и то сомнительно. Видимо, что-то очень криво было настроено. 8POWER- Код: sql 1. 2. 3. Это ж терабайт с четверью памяти в пределе. 8POWER- Код: powershell 1. Зачем, если вы его не используете? 8POWER-Работает все как самолет ровно до того момента, как не очистишь кеш памяти, либо не перезагрузишь сервер. Стоит дебиан. Я так понимаю, что MySQL хранит индексы в памяти и берет ее под кеш. Потому что после некоторых манипуляций выборка сразу начинает летать. Какие манипуляции нужно сделать, чтобы сервер полетел:Логично, ведь нужно прочитать с диска несколько гигабайт. Чтобы загрузить индексы в кэш индексов MyISAM можно использовать LOAD INDEX INTO CACHE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2018, 22:01 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
8POWER-, Кстати, покажите новый DDL таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2018, 22:03 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
miksoft8POWER-, Кстати, покажите новый DDL таблицы. DDL на данный момент: Код: sql 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. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2018, 22:08 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
miksoft8POWER-Иннодб в 20 раз медленнееНе верю. В 2 раза и то сомнительно. Видимо, что-то очень криво было настроено. 8POWER- Код: sql 1. 2. 3. Это ж терабайт с четверью памяти в пределе. 8POWER- Код: powershell 1. Зачем, если вы его не используете? 8POWER-Работает все как самолет ровно до того момента, как не очистишь кеш памяти, либо не перезагрузишь сервер. Стоит дебиан. Я так понимаю, что MySQL хранит индексы в памяти и берет ее под кеш. Потому что после некоторых манипуляций выборка сразу начинает летать. Какие манипуляции нужно сделать, чтобы сервер полетел:Логично, ведь нужно прочитать с диска несколько гигабайт. Чтобы загрузить индексы в кэш индексов MyISAM можно использовать LOAD INDEX INTO CACHE 1. show profiles (1 таблица - myisam, 2 таблица - innodb) , тестирую пока что на домашнем компе на M2 диске, 3000/2500 мб. Немного ошибся, не в 20 раз медленее, а 10. Конфиг не настроен ни для myisam, ни для innodb. Код: powershell 1. 2. 3. 4. 2. На счет терабайта с четвертью памяти - да, согласен, но ведь mysql эту память не использует всегда? Он же ее добавляет по количеству коннекшенов вроде как. Пока что max_used_connections за неделю было 227. Могу снизить до 400-500. Не знаю, даст ли это что-то. 3. innodb_buffer_pool_size = 512M , упс. уберу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2018, 22:13 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
Я так понимаю, что индексы всегда будут храниться в памяти? И единственный для меня выход при появлении новых больших таблиц, чтобы это все быстро работало - либо уменьшать размер индексов (порезав индексы и потеряв скорость), либо искать сервер с большей оперативкой, что практически неподъемные деньги. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2018, 22:22 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
8POWER-Конфиг не настроен ни для myisam, ни для innodb.Тогда это ни о чем. Умолчательный конфиг в MySQL никогда, пожалуй, не был адекватным. 8POWER-На счет терабайта с четвертью памяти - да, согласен, но ведь mysql эту память не использует всегда? Он же ее добавляет по количеству коннекшенов вроде как. Пока что max_used_connections за неделю было 227. Могу снизить до 400-500. Не знаю, даст ли это что-то.Пока памяти хватает - ничего не даст. Когда памяти не будет хватать, лучше получить явную ошибку о нехватке коннекшенов новым клиентам, нежели вывалить MySQL в своп и парализовать работу многих (или даже всех) уже подключенных клиентов. 8POWER- Код: powershell 1. Идексы вида (`p1`,`date`) не пробовали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2018, 23:16 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
8POWER-Я так понимаю, что индексы всегда будут храниться в памяти? И единственный для меня выход при появлении новых больших таблиц, чтобы это все быстро работало - либо уменьшать размер индексов (порезав индексы и потеряв скорость), либо искать сервер с большей оперативкой, что практически неподъемные деньги.Тут надо разделять разные виды кэша. MyISAM в своем кэше (который key_buffer_size) умеет хранить только индексы, но не умеет таблицы. Файловая система хранит в своем кэше любые файлы, которые кто-либо читает на этом сервере (при условии, что читающий это явно не запретил). В том числе файлы с индексами и таблицами. Есть еще варианты. Например, как говорилось раньше, перейти на вертикальную структуру и InnoDB. Таблицы в InnoDB по внутреннему устройству фактически являются индексами с дополнительными полями. Поэтому выборка по первичном ключу вполне может быть быстрее выборки по обычному индексу в MyISAM, т.к. не будет необходимости отдельно читать содержимое таблицы. Или, например, сделать покрывающий индекс. Т.е. поместить в него все поля, используемые в запросе, чтобы не читать содержимое таблицы. Но при текущей структуре таблицы, возможно, не хватит памяти, чтобы закэшировать ваши 9 индексов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2018, 23:23 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
miksoft8POWER-Конфиг не настроен ни для myisam, ни для innodb.Тогда это ни о чем. Умолчательный конфиг в MySQL никогда, пожалуй, не был адекватным. 8POWER-На счет терабайта с четвертью памяти - да, согласен, но ведь mysql эту память не использует всегда? Он же ее добавляет по количеству коннекшенов вроде как. Пока что max_used_connections за неделю было 227. Могу снизить до 400-500. Не знаю, даст ли это что-то.Пока памяти хватает - ничего не даст. Когда памяти не будет хватать, лучше получить явную ошибку о нехватке коннекшенов новым клиентам, нежели вывалить MySQL в своп и парализовать работу многих (или даже всех) уже подключенных клиентов. 8POWER- Код: powershell 1. Идексы вида (`p1`,`date`) не пробовали? Uueerdo, 786340 rows in set - its query SELECT date FROM ps_hands WHERE date = '2018-05-05'; That is, in one day so many entries (786k). And now imagine the index date .. A player is supposed to have a total of 300 thousand entries per year (as example). And we have to process so many dates. It will be very hard for the server. 786340 rows in set - это запрос Код: sql 1. Получается так много строк в среднем за один день (по дате). Поэтому представьте какой будет индекс, если проиндексировать дату и сколько строк придется обработать серверу. А у игрока в среднем будет 30к строк, конечно может быть и 20 а может быть и 2 млн. Смотря, что за игрок. Это как пример. Это будет сильно сложно для сервера, если индексировать по дате. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2018, 23:30 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
miksoft8POWER-Я так понимаю, что индексы всегда будут храниться в памяти? И единственный для меня выход при появлении новых больших таблиц, чтобы это все быстро работало - либо уменьшать размер индексов (порезав индексы и потеряв скорость), либо искать сервер с большей оперативкой, что практически неподъемные деньги.Тут надо разделять разные виды кэша. MyISAM в своем кэше (который key_buffer_size) умеет хранить только индексы, но не умеет таблицы. Файловая система хранит в своем кэше любые файлы, которые кто-либо читает на этом сервере (при условии, что читающий это явно не запретил). В том числе файлы с индексами и таблицами. Есть еще варианты. Например, как говорилось раньше, перейти на вертикальную структуру и InnoDB. Таблицы в InnoDB по внутреннему устройству фактически являются индексами с дополнительными полями. Поэтому выборка по первичном ключу вполне может быть быстрее выборки по обычному индексу в MyISAM, т.к. не будет необходимости отдельно читать содержимое таблицы. Или, например, сделать покрывающий индекс. Т.е. поместить в него все поля, используемые в запросе, чтобы не читать содержимое таблицы. Но при текущей структуре таблицы, возможно, не хватит памяти, чтобы закэшировать ваши 9 индексов. 1. - возможно ли вообще перегнать файлы с индексами и таблицами (если уж и то и то) в кеш файловой системы вместо памяти? и чтобы это так же быстро работало. если нет, тогда придется мне с масика 5.6 обновляться на 8 и юзать иннодб. 2. горизонтальную таблицу вы еще тогда упоминали, но я сразу испугался и до сих пор не понимаю, как ее реализовать. т.к. по моему она только больше весить будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2018, 23:32 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
8POWER-Получается так много строк в среднем за один день (по дате). Поэтому представьте какой будет индекс, если проиндексировать дату и сколько строк придется обработать серверу.В индексе хранится столько же записей, сколько и во всей таблице. Так что если текущий `handLimit` заменить на `date`, то прирост размера одного индекса составит всего 1 байт на запись. И, заметьте, я говорю не об отдельном индексе по полю `date`, а об индексе по двум полям. В этом случае выборка по второму полю осуществляется уже по той ветке индекса, которая была найдена по первому полю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2018, 23:48 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
8POWER-возможно ли вообще перегнать файлы с индексами и таблицами (если уж и то и то) в кеш файловой системы вместо памяти?Слово "вместо" не имеет смысла, т.к. кэш файловой системы и располагается в памяти. И да, как показали ваши эксперименты, при каких-либо операциях с таблицами (с точки зрения ФС - с файлами) кэш ФС наполняется содержимым этих файлов. 8POWER-горизонтальную таблицу вы еще тогда упоминали, но я сразу испугался и до сих пор не понимаю, как ее реализовать. т.к. по моему она только больше весить будет.Вертикальную. Сама таблица весить будет примерно столько же. Чуть больше накладных расходов, но и чуть экономии за счет отказа от хранения пустых мест в игре (когда играют меньше 9 человек). Но зато полностью пропадет необходимость в индексах, т.к. в InnoDB таблица сама будет своим индексом по первичному ключу. Наверное, можно такое и в рамках MyISAM провернуть. Особенно, если сделать покрывающий индекс. Но это надо тестить. 8POWER-с масика 5.6 обновляться на 8Обновляться-то зачем? Тут вроде не нужно никаких фич 8 версии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2018, 23:57 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
miksoft, Спасибо вам за все советы, сейчас буду долго и нудно тестить, потом отпишусь о результатах. И наконец-то попробую все-таки перевернуть таблицу. Покажу допустим 30 строк, как она выглядела до и как выглядит после. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2018, 00:14 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
8POWER-, обновиться стоит , как минимум до 5.7.хх ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2018, 05:06 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
miksoft, попытался развернуть таблицу. Как было: http://i.piccy.info/i9/fad2f983861769a1a25feae798150d4b/1539278550/8136/1271065/screenshot17.png и DDL: Код: sql 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. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. Как стало: создал 2 таблицы 1) Хранит данные о руке, имеет уникальный ID. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 2) Содержит игроков и что они выиграли, связана по внешнему ключу ID в первой таблице. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Правильно ли я всё сделал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2018, 20:59 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
miksoft, подскажите пожалуйста, я просто хочу уточнить, потому что данные мне заливать придется минимум день.. в сумме 300 млн строк будет( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2018, 01:14 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
8POWER-, Нет, не совсем правильно. В эту структуру заливать данные не стоит. Я на бегу, не могу с телефона полноценно ответить :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2018, 07:56 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
miksoft8POWER-, Нет, не совсем правильно. В эту структуру заливать данные не стоит. Я на бегу, не могу с телефона полноценно ответить :( Хорошо, спасибо, буду ждать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2018, 14:09 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
8POWER-, Я так понимаю это выходные, но если что, все еще жду :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2018, 20:34 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Как-то так, если не требуется знать порядок игроков в рамках одной игры. Возможно, что-то напутал в синтаксисе, но идея должна быть понятна - в каждой из таблиц в PK ведущим полем является именно то поле, по которому будет вестись поиск. Учтите, что структура приспособлена под конкретный запрос. Для других условий она может быть неподходящей. В таблицу players не надо писать все 9 записей на каждую игру, а только по числу фактических участников. Запрос будет как-то так: Код: sql 1. 2. 3. 4. 5. 6. SQL_NO_CACHE указал специально, чтобы результаты из кэша результатов запросов не брались. Залейте немного данных, например 1 миллион игр, и покажите план запроса после этого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2018, 21:08 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
miksoft Код: sql 1. Тут, наверно, все же PRIMARY KEY (`handId`), т.к. по факту поле `handId` будет уникальным, добавлять второе поле смысла нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2018, 21:16 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
miksoft, Ооо, ура)) здравствуйте. Сейчас все прочитаю, скажите пожалуйста, а можно ли еще как-то связаться с вами, кроме форума? Например скайп. Быстрее бы разговор прошел и я бы отблагодарил :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2018, 21:20 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
8POWER-а можно ли еще как-то связаться с вами, кроме форума? Например скайп.Скайпа у меня нет, как-то не нужен был никогда. И, честно говоря, я не очень люблю личные контакты, поскольку они налагают определенную личную ответственность, а в текущее время я к этому не готов. Прошу понять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2018, 21:27 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
miksoft, Я вас понял, ничего) тогда у меня сразу к вам парочка вопросов, если не против. #1 Решил попробовать LOAD INDEX INTO CACHE, как вы советовали. Очистил снова кеш дебиана. Запрос (на выборку 200к строк) начал грузиться 60 сек. Затем загрузил все индексы в кеш. Запрос стал грузиться 15 сек. Думаю блин, попробую теперь сделать дубликат таблицы. Сделал дубликат. В таблице, которая задублирована - этот же запрос выполняется 1сек. Как такое происходит? :( #2 Поставил на домашний комп 8 масик, залил эту же таблицу в 216 млн строк. Делаю аналогичный запрос без всяких загрузок индексов в кеш - 1 секунда времени занимает. Учитывая, что оперы на компе всего 16гб. А на сервере аж 128 и из них кешируется 50, если индексы загружать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2018, 21:34 |
|
||
|
Продолжение борьбы со скоростью выполнения запросов
|
|||
|---|---|---|---|
|
#18+
8POWER-Очистил снова кеш дебиана. Запрос (на выборку 200к строк) начал грузиться 60 сек. Затем загрузил все индексы в кеш. Запрос стал грузиться 15 сек.Даже несколько раз подряд 60 секунд? И потом несколько раз подряд по 15 секунд? При замерах времени выполняйте запросы несколько раз, чтобы лучше понимать влияние кэшей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2018, 22:09 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39716471&tid=1829546]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 380ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...