2009-12-21 2 views
2

У меня эта проблема на нашем производственном сервере. Стека приложение,MySQL как запрос работает очень медленно для таблицы 5000 записей

  • Java-приложение на веб-сервере 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? Любая идея отладить это. Я сейчас предоставляю подробные журналы и буду постоянно обновлять этот вопрос с моими выводами, но буду благодарен за ваши знания db.

+0

Это должно было написать заявление в тексте BOLD. Возможно, я использовал неправильный тег MarkDown. Позвольте мне исправить это – jatanp

+0

Я получаю его. Я починил это. – Asaph

+3

Я бы не ожидал 'select * от клиента, где код типа '% a%'' был бы быстрым, поскольку он не мог использовать индекс. Каждая запись должна быть проверена. Рассмотрите 'select * от клиента, где код, например 'a%' ', если это возможно, поскольку это может реально использовать индекс. – Asaph

ответ

0

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

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

+0

Я полагаюсь на ibatis, чтобы получить записи. Фактически, время включает время отправки в оба конца и логическое выполнение. Если вы считаете, что время фактического времени составляет около 4 секунд. Позвольте мне изменить это в моем вопросе. Также, пожалуйста, дайте мне знать, что я должен искать в конфигурации MySQL. – jatanp

-1

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

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

+0

Я не могу этого сделать. Это поле ввода пользователя. – jatanp

2

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

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

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

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

0

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

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^