Melanxolik Опубликовано: June 22, 2016 at 20:28 Опубликовано: June 22, 2016 at 20:28 http://ruhighload.com/post/Работа+с+индексами+в+MySQL
KaYot Опубликовано: June 22, 2016 at 20:59 Опубликовано: June 22, 2016 at 20:59 Да, запрос нужно переделать, на входе давать start_time и end_time сразу в unixtime, и проверки делать стандартным >start AND <end. Тогда заработает индекс и по этому полю. А при использовании FROM_UNIXTIME ключ работать не может, идет полный просмотр таблицы. Попробуйте explain еще раз сделать, с созданными ключами. Только в условии что-то вразумительное задайте, не select *
Golthana Опубликовано: June 22, 2016 at 21:02 Автор Опубликовано: June 22, 2016 at 21:02 Да, запрос нужно переделать, на входе давать start_time и end_time сразу в unixtime, и проверки делать стандартным >start AND Я даже представление не имею каким должен быть запрос. Честно говоря, я еле этот склеил) Так что был бы признательный за пример запроса в моем случае
Golthana Опубликовано: June 22, 2016 at 21:04 Автор Опубликовано: June 22, 2016 at 21:04 (изменено) Попробуйте explain еще раз сделать, с созданными ключами. Только в условии что-то вразумительное задайте, не select * Индекс еще создается... Так что позже сделаю Переменные stardate и enddate имеют значение ГГГГ-мм-дд (2016-06-06) Изменено June 22, 2016 at 21:06 пользователем Golthana
Ruslik Опубликовано: June 22, 2016 at 21:09 Опубликовано: June 22, 2016 at 21:09 Все ерунда. Поставьте ссд диск и будет нормально. Диск даст +10-20тыс% производительности. Индексы-кеши дадут максимум +20-30%.
Golthana Опубликовано: June 22, 2016 at 21:13 Автор Опубликовано: June 22, 2016 at 21:13 Поставьте ссд диск и будет нормально. К сожалению, нет такой возможности. Даже, если результатом всех вышеупомянутых манипуляций даст хоть какой-то результат - уже будет прорыв в моём случае. А за совет спасибо. В будущем буду обращать внимание.
KaYot Опубликовано: June 22, 2016 at 21:25 Опубликовано: June 22, 2016 at 21:25 Все ерунда. Поставьте ссд диск и будет нормально. Диск даст +10-20тыс% производительности. Индексы-кеши дадут максимум +20-30%. Нормальная база должна целиком быть в RAM-кеше, и обращаться к диску изредка для выгрузки блока. Предложение поставить SSD ерунда. Да и индексы дадут не 20-30%, а 20к-30к%
Golthana Опубликовано: June 22, 2016 at 21:31 Автор Опубликовано: June 22, 2016 at 21:31 Что-то я не могу сообразить каким должен быть запрос, чтобы unixtime сделать выборку по диапазону дат
bos Опубликовано: June 22, 2016 at 21:40 Опубликовано: June 22, 2016 at 21:40 я не знаю, почему вы не захотели использовать вторую часть моего совета, может религия, может я чего не знаю. но на всякий случай: https://habrahabr.ru/post/66151/- почитайте зачем и как используется)
ValRevan Опубликовано: June 22, 2016 at 21:41 Опубликовано: June 22, 2016 at 21:41 Все ерунда. Поставьте ссд диск и будет нормально. Диск даст +10-20тыс% производительности. Индексы-кеши дадут максимум +20-30%. Нормальная база должна целиком быть в RAM-кеше, и обращаться к диску изредка для выгрузки блока.Предложение поставить SSD ерунда. Да и индексы дадут не 20-30%, а 20к-30к% В нормальных СУБД ОЗУ важнее дисковой подсистемы Лично я бы сначало проверил настройки СУБД и глянул хватает ли ОЗУ А затем еще сам запрос бы покрутил
Golthana Опубликовано: June 23, 2016 at 05:16 Автор Опубликовано: June 23, 2016 at 05:16 required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again Ошибка по время создание индекса
Golthana Опубликовано: June 23, 2016 at 05:25 Автор Опубликовано: June 23, 2016 at 05:25 (изменено) я не знаю, почему вы не захотели использовать вторую часть моего совета, может религия, может я чего не знаю. но на всякий случай: https://habrahabr.ru/post/66151/-почитайте зачем и как используется) Предлагаете разбить ее по неделям, например? Дело в том, что на данный момент в таблице данные только со второго числа сего месяца Изменено June 23, 2016 at 06:02 пользователем Golthana
dead Опубликовано: June 23, 2016 at 06:43 Опубликовано: June 23, 2016 at 06:43 1) Выбрать правильный тип таблицы. Тут звучал неправильный совет сконвертировать в иннодб. Иннодб - это транзакционный движок, это очень хорошо, но не в данном случае, поскольку этот функционал только ухудшит производительность. Для таких таблиц в своем биллинге я как раз и использую майисам, для всех остальных инодб. 2) Под миллиард записей - это многовато для мускула, разумно делить инфу на таблицы и группировать инфу скажем по дням (я так делаю) 3) Подобрать правильный тип полей, по максимуму сделать их маленькими и желательно цифровыми. Например ip хранить в виде insigned int и при select делать inet_ntoa(ip). По возможности выкинуть поля, которые использоваться не будут 4) Сделать индексы и главное правильные индексы. Индексы занимают объем и чтобы и если их много, они тупо не поместятся в ОЗУ и будет тупняк. Для такой таблицы индексы могут занимать громадный объем, несколько десятков процентов от ее объема. Возможно надо делать составные индексы - это нужно смотреть на конкретные sql 5) Хороший объем ОЗУ на сервере. Подтюнить конфиг mysql под использование большего количества ОЗУ 6) Тюнить сами SQL Explain-ами чтобы использовали индексы 7) Более быстрый диск, конечно добавит производительности 8) Не забывать, что параллельно select к тебя будут идти постоянные insert (тут мне влом описывать к чему это приводит и как поступить) Короче, самый главный пункт - это 2
dead Опубликовано: June 23, 2016 at 06:46 Опубликовано: June 23, 2016 at 06:46 Да, count(*) from table берется из метаданных таблицы, поэтому происходит мгновенно на любом количестве записей
alsdfg Опубликовано: June 23, 2016 at 06:52 Опубликовано: June 23, 2016 at 06:52 (изменено) Даю совет на миллион. Если ТС еле запрос склепал что толку ему за индексы рассказывать? Найми тут кого-то на форуме, дай пару по десять долларов - тебе и запрос оптимизируют и растолкуют как это было сделано. А дальше уже сам будешь мануалы курить в нужном направлении или сохранишь в избранное номер специалиста. Хотя если скорость решения проблемы не важна, то можно и потолковать за индексы. Изменено June 23, 2016 at 06:53 пользователем alsdfg
NiTr0 Опубликовано: June 23, 2016 at 08:50 Опубликовано: June 23, 2016 at 08:50 Например? unix_secs between '".$starttime."' AND '".$endtime." никаких функций от значений столбцов в WHERE, поиск только по значениям. Индексы, движки - это конечно все возможно и даст небольшой прирост. бред, таблицы на десятки, а то и сотни гигабайт с индексами вполне успешно работают с временем запроса в десятки миллисекунд. если руки у писавшего запросы ровные... Судя по самому запросу и размеру БД, проблема в том, что создается временная таблица на диске (диски наверное не ssd?), причем не маленькая. вы вообще в курсе, что такое "временная таблица" и когда она создается? намекаю - она создается при join-ах, которыми в запросе и не пахнет. Под миллиард записей - это многовато для мускула ну у меня на порядок меньше где-то в БД заббикса. работает весьма шустро. при этом - под сотню значений в секунду заносится. innodb, да (оно хорошо тюнится под хайлоад - опять же в отличие от ископаемого myisam). а было, отключилась чистка stale значений после апдейта заббикса, и все писалось как есть, БД разжирела под 200 гиг - и тоже ничего не тормозило...
Melanxolik Опубликовано: June 23, 2016 at 09:23 Опубликовано: June 23, 2016 at 09:23 Индексы не дадут прироста Оо, поставить ssd oOМне кажется кто-то увлекается... Правильные индексы всегда дают прирост, БД в 100 записей можно уволить в хлам без индексов несколькими запросами. INNODB под статические записи? ужас. Подумайте зачем в обще используют InnoDB? Один из ответов это Lock на уровне строки... А если у вас тупые Insert и select, накой вам Lock? MyISAM пока самый шустрый вариант для тупых данных. Zabbix делает безумное количество Insert и Delete по этой причине там нужна InnoDB в остальных случаях в сад. Надеюсь не забываете для InnoDB perf file выставлять... а то мало ли... TMP_TABLE в раму или на SSD, остальное только за счет индексов и правильного типа полей, плюс несколько ключей для тюнинга параметров, все остальное зависит исключительно от профиля хранимых данных. Иногда лучше сделать выборку во временную таблицу, потом её обработать чем гонять массив данных туда сюда.
NiTr0 Опубликовано: June 23, 2016 at 09:41 Опубликовано: June 23, 2016 at 09:41 MyISAM пока самый шустрый вариант для тупых данных. как показывает практика - нет, переход в заббиксе с myisam на innodb дал прирост на пару порядков. myisam - разве что для сайтов-визиток и прочих "огромных объемов данных", ввиду своей примитивности. Zabbix делает безумное количество Insert и Delete по этой причине там нужна InnoDB у ТСа в таблице вообще хранятся netflow'ы. да-да, под ярд записей за 3 недели. это не "безумное кол-во инсертов"? и да, delete тутразве не будет использоваться? а главное - расскажите, как MyIASM живет при 600 инсертах в секунду, и при размере БД в несколько десятков ярдов записей... и как хорошо он переносит внезапные отключения питания
dead Опубликовано: June 23, 2016 at 09:45 Опубликовано: June 23, 2016 at 09:45 INSERT-ы надо агрегировать в INSERT INTO .. (val, val,val), (val, val,val), (val, val,val) - тогда никаких проблем не будет
Prime Опубликовано: June 23, 2016 at 10:27 Опубликовано: June 23, 2016 at 10:27 еще можно поставить PostgreSQL и с коробки будет все работать без тюнинга
Golthana Опубликовано: June 23, 2016 at 10:31 Автор Опубликовано: June 23, 2016 at 10:31 еще можно поставить PostgreSQL и с коробки будет все работать без тюнинга Можно затестить)
Melanxolik Опубликовано: June 23, 2016 at 10:43 Опубликовано: June 23, 2016 at 10:43 как показывает практика - нет, переход в заббиксе с myisam на innodb дал прирост на пару порядков. да не сравнивайте вы xxx с пальцем, разные задачи, разные наборы данных. myisam в случае краха гораздо проще восстановить, в отличии от innodb, там огромные отличия, опять же, надо подбирать правильный инструмент под задачи. Вам ранее уже объяснили чем в первую очередь отличается innodb от других типов, транзакционная модель хранения данных. В одних случая она хороша, в других убийство.
NiTr0 Опубликовано: June 23, 2016 at 11:02 Опубликовано: June 23, 2016 at 11:02 еще можно поставить PostgreSQL и с коробки будет все работать без тюнинга постгря медленнее мускула... да не сравнивайте вы xxx с пальцем, разные задачи, разные наборы данных. задачи идентичные - хранить огромный объем простых данных, с простыми выборками по ним, и кучей инсертов, + потом ессно возникнет потребность в чистке старых неактуальных агрегированных данных (да-да, та самая куча delete). myisam в случае краха гораздо проще восстановить, в отличии от innodb, там огромные отличия, вот только проблема в том, что myisam крашится от любого чиха т.к. не умеет ни транзакции, ни проверку целостности записанных данных, а innodb - просто работает... Вам ранее уже объяснили чем в первую очередь отличается innodb от других типов, транзакционная модель хранения данных. В одних случая она хороша, в других убийство. не только этим. еще более развитым кешированием. что и дает ей некислый прирост производительности.
Golthana Опубликовано: June 30, 2016 at 08:44 Автор Опубликовано: June 30, 2016 at 08:44 unix_secs between '".$starttime."' AND '".$endtime." Таким образом не работает. Запрос формируется с датой в виде ГГГГ-мм-дд, а значения в столбце unix_secs имеют другой вид.
Prime Опубликовано: June 30, 2016 at 10:23 Опубликовано: June 30, 2016 at 10:23 постгря медленнее мускула... важно то, что грамотно и точно настроенный mysql будет быстрее
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВойти
Уже зарегистрированы? Войдите здесь.
Войти сейчас