За последние 24 часа нас посетили 23706 программистов и 1603 робота. Сейчас ищут 830 программистов ...

Уменьшение скорости работы БД

Тема в разделе "MySQL", создана пользователем Dmitriy A. Arteshuk, 26 дек 2014.

  1. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Имеем БД, innodb конфиг такой

    Код (Text):
    1.  
    2. [mysqld]
    3. federated
    4. pid-file = /var/run/mysqld/mysqld.pid
    5. datadir=/var/lib/mysql
    6. socket=/var/lib/mysql/mysql.sock
    7. user=mysql
    8. # Disabling symbolic-links is recommended to prevent assorted security risks
    9. symbolic-links=0
    10. max_allowed_packet = 64M
    11.  
    12.  
    13. thread_cache_size = 8
    14. query_cache_size = 64M
    15. query_cache_limit = 16M
    16. sort_buffer_size = 8M
    17. read_rnd_buffer_size = 16M
    18. #thread_concurrency = 8
    19. tmp_table_size = 128M
    20. max_heap_table_size = 128M
    21. key_buffer_size = 32M
    22. table_open_cache = 2048
    23.  
    24. innodb_buffer_pool_size = 2G
    25. innodb_additional_mem_pool_size = 20M
    26. innodb_flush_log_at_trx_commit = 2
    27. innodb_thread_concurrency = 16
    все вроде чудно, все пашет....НО

    Есть одна задача, она описана в одной функции, она по кругу вызывает сама себя пока не закончит обрабатывать некую таблицу

    И есть такая особенность, начинает работать все это за здравие, очень быстро

    Но по мере выполнения задачи процесс замедляется, т.е. к примеру если вначале 300 строк обрабатывается за 0.5 секунды, то обработав 50 тысяч строк, другие 300 строк обрабатываются уже 5 секунд (((

    Может подскажите куда копать?

    Или мало инфы дал?
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    … LIMIT n,m используется?
     
  3. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    нет

    там смотри, идет выборка из таблицы удовлетворяющая какому то условию

    в выборке может быть и 1 строка и 1000

    далее это 1-1000 строк обрабатываются и распихиваются по другим таблицам

    далее то что попало под эту выборку удаляется из таблицы и функция вызывает сама себя для следующей итерации
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    тогда предположу, что следующая итерация в том же процессе: без освобождения памяти, без завершения транзакции. это накладно.
     
  5. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    я то же так думал, поэтому перед следующей итерацией удаляю все переменные

    насчет транзакций

    после обработки строк из выборки, открывается транзакция, все бухается в 3-4 таблицы, транзакция закрывается, функция вызывает сама себя

    может как по другому попробовать?

    я долго колдовал с конфигом, и в какой то момент у меня все работало очень шустро, потом что то еще наколдовал...и опять тупняк по нарастающей (
     
  6. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    так...самое знающее сообщество, активизировались! )
     
  7. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    там может не в конфиге было, а вообще в чём-то ещё. вообще рекурсия с запросами это жестоко, там раз на раз не приходится))
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Реально непонятно зачем здесь нужна рекурсия. Почему нельзя заново стартовать скрипт с гарантированно новой средой и новой транзакцией. PHP "рожден чтобы умирать" ;) Не настаиваю, просто я бы сделал ежеминутный крон с проверкой какой-нибудь блокировки на случай если предыдущая итерация еще не закончилась.

    Добавлено спустя 7 минут 40 секунд:
    P.S. Понятно, что ты задал вопрос про конфигурацию БД, но кажется она не при чем.
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не-не-не. пхп так не работает :D
     
  10. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Сегодня я нашел причину тупняка...конфиг да..ваще не при делах. Всякий разный софт для анализа говорил то то увеличить, то это.

    Проблема была вот в чем: внутри транзакции вставлялись махам много строк, часть сотни, иногда десятки тысяч.

    А потом, по полю варчхар выбирались некие значения, получаемые путем перебора массива. Ключи у массива как строковые, так могут бытьь и инт.

    Так вот, запрос инта в поле варчхар занимал 0.1-0.2 секунды!!!

    А запрос стринга от инта 0.001 сек ))))

    Жесть...никогда бы не подумал )

    Да...вот еще что. Когда в бд было 100-200 тысяч строк, все работало влет. Стало больше ляма....на тебе.

    Зы сори, с телефона пишу.

    Убивать совсем не хочу, ибо перед первым запуском идет несколько выборок из бд которые потом как параметры функции передаются.


    Ну хотя там семечки конечно...пару десятых секунды.

    Добавлено спустя 8 минут 32 секунды:
    Да...замедление работы может и есть, но на глаз я его не заметил, завтра понаблюдаю еще
     
  11. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Абракадабра. :(
    Нужен пример для понимания Вашей цитаты.
     
  12. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    select id from table where field = 123 // 0.1 cek
    select id from table where field = '123' // 0.001 cek

    field - столбец VARCHAR 50
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    согжи свою структуру БД уже. мучаешься с ней столько...
     
  14. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    5 раз менялась ) это пока оптимальный вариант )

    Добавлено спустя 3 минуты 44 секунды:
    Понимаешь...если бы все зависело только от меня, в этом поле был ты int.

    Но я не могу заставить сотни магазинов переделать свои бд (((

    У них вот так заведено, id товара это

    А123
    В456
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а я не про то, что там должен быть инт :D

    Инт это скучно. Все теги всегда словами и всегда быстро. Где грабли? =)
     
  16. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Дык я же выше написал ) Они в том, что выбирается значение INT из поля VARCHAR. Как только я сделал string(123) работать стало в 100 раз быстрее )
     
  17. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    у тебя это поле проиндексировано уникально?
     
  18. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    оно не уникально, но проиндексировано

    возможно проблема еще в том, что внутри одной транзакции все это происходит, т.е. например одним запросом insert 1000 строк, потом надо взять fields 10 строк из только что вставленных, соответвенно табличка еще не переиндексировалась, может по этому
     
  19. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Думаю здесь не одна заморочка, а две. Они просто присутствуют одновременно. Длинная транзакция сама по себе и смена плана запроса при "неправильных" константах сама по себе.

    Я на экспериментах с INT вместо CHAR столкнулся с такой штукой в EXPLAIN EXTENDED:
    В одних случаях он пишет в Extra:
    А в других случаях в Extra:
    Почему так: по возможности MySQL сравнивает твои константы из запроса с известным ему набором значений. И в некоторых случаях сразу решает "такого значения нет, запрос можно не выполнять". Как если бы было указано "… WHERE 0"
    А при других константах ему таки придется сканировать таблицу.
    Целые-вместо-строк гарантированно не используют const таблицы!

    Поиграй с EXPLAIN EXTENDED SELECT … и сразу после него попробуй SHOW warnings, бывает любопытно ;)
     
  20. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Будет время обязательно поиграюсь, спасибо!
     
  21. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Тут проблема не в типе константы (при необходимости будет "тихая" конвертация).
    Смотри план выполнения запроса - возможно в первом случае не используется индекс. Попробуй добавить "use index()" или "force index()", возможно поможет.
     
  22. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Chushkin да вроде string(123) решил вопрос )
     
  23. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Чушкин, в некоторых случаях использование индекса не самая быстрая стратегия ;)
     
  24. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Это может быть частный случай. Скорее всего "тупит" оптимизатор.
    Кто бы спорил. Но иногда оптимизатор тупит и ему надо помочь, поэтому я и написал "возможно поможет".
     
  25. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    чувак, проблема только в одном, ты делаешь запрос строки без кавычек. Делай в кавычках, может даже используй сфинкса и будет тебе счастье, выноси старые записи в архив, ограничивай поиск по дате и т.п.