MySQL как запрос выполняется очень медленно для таблицы 5000 записей - PullRequest
2 голосов
/ 21 декабря 2009

У меня есть эта проблема на нашем производственном сервере. Стек приложения:

  • Java Web App на Tomcat 6.0.18
  • Уровень доступа к данным iBatis
  • База данных MySQL 5.0
  • CentOS

Система развернута на виртуальном сервере, имеющем около 256 МБ памяти.

Реальная проблема:

Запрос, как,

select * from customer

выполняется примерно за 10 секунд, однако, если выполняется следующий запрос,

select * from customer where code like '%a%'

сразу после выполнения вышеуказанного запроса, система переходит к неопределенной обработке и в конечном итоге заставляет Tomcat перезапустить!

Статистика таблицы: - Количество записей: 5000 - Первичный ключ: код

Тот же запрос PHP MyAdmin выполняется примерно за 4 секунды.

Как вы думаете, это может быть проблема с MySQL? Любая идея отладить это. Сейчас я включаю подробные журналы и буду обновлять этот вопрос своими выводами, но буду признателен за понимание вашей базы данных.

Ответы [ 5 ]

2 голосов
/ 21 декабря 2009

Недавно я столкнулся с похожей проблемой с MySQL в одной из моих производственных систем.

Как отметил выше комментатор, проблема заключается в поиске по шаблону в текстовом поле и, в частности, в начале% поиска.

Мы сократили начальный% и сократили время, затрачиваемое на поисковый запрос, на несколько порядков (с сервера, который перемалывает 60 секунд + до "вообще нет времени").

Альтернативой может быть использование полнотекстового индекса или системы, подобной Lucene, для поиска.

0 голосов
/ 24 декабря 2009

В вопросе автора указывается, что тот же запрос выполняется за 4 секунды в PHP MyAdmin, поэтому проблема не в MySql или невозможности использовать индекс из-за%, а в Tomcat или слое доступа к данным.

0 голосов
/ 24 декабря 2009

% в начале поиска приводит к тому, что таблица никогда не использует индекс. % Является подстановочным знаком, поэтому он должен проходить каждую запись в базе данных. Объедините это с тем фактом, что tomcat работает так же, как и MySQL, делает его еще хуже. Существует не так много места, чтобы поместить индекс в память для чтения.

Вам нужно увеличить объем памяти в этом блоке, чтобы MySQL мог создать необходимые кеши памяти, которые ему нужны, и место для быстрого выполнения запросов.

0 голосов
/ 21 декабря 2009

Вы пытались создать первичное поле автоинкремента и сделать код отдельным уникальным индексом.

У меня раньше были проблемы с текстом в качестве первичного ключа, который в некоторых средах был очень медленным.

0 голосов
/ 21 декабря 2009

Похоже, что ваш сервер MySQL настроен неправильно, 10 000 записей для 5000 не должны быть приемлемыми.

Как вы получаете доступ к своей БД через код Java? В этом случае, пожалуйста, укажите здесь свою высокоуровневую логику, возможно, вы неэффективно повторно используете обработчики БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...