Назад | Перейти на главную страницу

MySQL 5.5 и MariaDB 5.5 возвращают разное количество столбцов для одних и тех же данных и одного и того же запроса выбора?

Некоторое время я искал в сети и не могу найти ответа по этому поводу. Буду очень признателен, если я могу получить совет. Вот вкратце проблема.

У нас есть 2 сервера. Один работает с 12 ядрами процессора и оперативной памятью 24 ГБ на centos6 / mysql5.5, а номер два - с 24 ядрами процессора и оперативной памятью 32 ГБ на centos7 / mariadb5.5. У обоих одинаковые данные в базе данных; он был продублирован с помощью mysqldump из mysql55 и импортирован в mariadb5.5. Конфигурация для mysql и mariadb также была скопирована из меньшей системы в большую; он буквально идентичен.

Первая проблема возникает при одинаковой нагрузке; mysql5.5 работает, как ожидалось, с load avrg. примерно от 4 до 8; mariadb5.5 работает очень плохо со средней нагрузкой от 700 до 900. Команда «показать список процессов» в системе mariadb обнаруживает множество соединений, работающих в течение длительного времени более 5 минут и находящихся в состоянии «Копирование в таблицу tmp». Те же запросы видны в меньшей системе mysql5.5, но они выполняются за 1-2 секунды.

Я пробовал запускать maraidb с tmpdir, созданным на большом разделе оперативной памяти. Это снизило нагрузку, но ненамного, она вернулась к 700.

Во-вторых, я заметил, что если я объясню по одному из длительных запросов, тот из mysql вернет около 3 тыс. Строк, а другой сервер - то же объяснение в том же запросе вернет около 7 тыс. Строк.

Я не уверен, чем это вызвано. В запросах преобладает "выбор" с несколькими "и" и "или".

Спасибо за уделенное время. Я был бы признателен за любой вклад по этому поводу.

После некоторого дальнейшего сравнения объяснений некоторых из самых длительных запросов к обеим системам я заметил, что сервер, на котором запущен mariadb, не использовал join_buffer при выполнении операции.

Когда я искал вероятную причину, я нашел эту переменную:

https://mariadb.com/kb/en/mariadb/server-system-variables/#join_cache_level

Конечно, после изменения этого значения на 8 со значения по умолчанию 2; поэтому мы предоставляем dbms больший выбор алгоритмов на основе блоков, из которых он может выбирать при выполнении операций соединения, все начало работать. Я не специалист по БД и не совсем уверен, какими могут быть последствия этого действия. Я подозреваю, что объем памяти увеличится, но с точки зрения производительности, похоже, коробка «летает». средняя нагрузка теперь снижена до 5 с 1200

Мой случай кажется каким-то изолированным, потому что приложение, которое я запускаю, выполняло очень длинные выборки с несколькими объединениями. Но я предполагаю, что поведение будет таким же для любого перехода с mysql на mariadb с аналогичной рабочей нагрузкой sql.

Я использую mariadb 10 под Centos 7 linux. Это хорошо работает, потому что по умолчанию база данных хранит каждую таблицу для каждого файла и индексы для другого файла. Убедитесь, что вы создаете индексы для полей, которые используются в предложениях «where» и «join on». Правильный выбор полей для индексов может повысить производительность более чем в 100 раз. Как установить mariadb 10 на Centos 7 вы можете найти там https://mariadb.com/kb/en/mariadb/yum/