2012-03-06 3 views
0

У меня есть таблица в MySQL db с около 25000 записей. Каждая запись содержит около 200 полей, многие из которых являются ТЕКСТ. Я ничего не могу сделать о структуре - это переход из старого файла db с плоскими файлами, который имеет 16-летние записи, а многие поля являются «текстовыми» типами типа «заметки».MySQL Улучшение скорости порядка по операторам

Пользователи могут просматривать любое количество полей и заказывать любое отдельное поле и любое количество квалификаторов. В этом случае наблюдается значительное замедление, которое обычно занимает несколько секунд, иногда до 7-10 секунд.

пример заявление может выглядеть следующим образом:

select a, b, c from table where b=1 and c=2 or a=0 order by a desc limit 25 

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

Я знаю, что индексы могут помочь ускорить это, но поскольку нет возможности узнать, какие поля будут отсортированы, мне нужно будет индексировать все 200 столбцов - то, что я прочитал об этом, Кажется, это непротиворечиво. Я понимаю, что при вставке или обновлении записей произойдет замедление, но если предположить, что это приемлемо, целесообразно ли добавлять индекс в каждый столбец?

Я читал о sort_buffer_size, но мне кажется, что все, что я читаю, конфликты с последней прочитанной мной записью - желательно ли увеличить это значение или любое другое сходное значение (read_buffer_size и т. Д.)?

Кроме того, основной идентификатор представляет собой сумасшедший шаблон, с которым они столкнулись в девяностые годы. Это ПК и поэтому следует индексировать в силу того, что он является ПК (справа?). Записи (и были) отправлены государству и их клиентам, и я не могу изменить формат. Эта колонка должна сортироваться на основе логики, которая существует, и включает хранимую процедуру с конкатенацией строк и подстрокой. Этот особый вид особенно медленный и, похоже, не кэшируется, хотя это поле индексируется, поэтому я задаюсь вопросом, есть ли что-нибудь, что я могу сделать, чтобы ускорить сортировку по этому конкретному полю (которое является порядком по умолчанию на).

TYIA.

+0

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

+0

@PeterKiss везде, где я был в состоянии использовать более оптимальный тип данных, но, как я уже говорил, многие из них представляют собой поля типа «примечания». Ничего большего, чем то, что я сделал, не произойдет. И без родов он работает отлично - узкое место все в этом роде. – momo

+0

Если бы я был вами, я бы следил за всеми запросами в фоновом режиме (например, сохранить все запросы, если это возможно), тогда я буду запускать их с помощью ключевого слова explain и собирать наиболее используемые столбцы и строить на них индексы sima. Отдельные индексы по столбцам не помогут! –

ответ

0

я должен индексировать все 200 столбцов

Это не очень хорошая идея. Из-за того, как MySQL использует индексы, большинство из них, вероятно, никогда не будут использоваться, все еще создавая довольно большие накладные расходы. (подробнее см. главу 7.3 в ссылке ниже). Однако вы могли бы попытаться определить, какие столбцы чаще всего появляются в разделе WHERE, и индексировать их.

В долгосрочной перспективе, скорее всего, вам, вероятно, потребуется найти способ переделать структуру данных во что-то более управляемое, потому что теперь оно имеет запах «электронной таблицы, превращенной в базу данных», которая не является приятный запах.

Я читал о sort_buffer_size, но кажется, что все, что я читал конфликты с последним, что я прочитал - это то целесообразно увеличить это значение, или любой из других аналогичных ценностей (read_buffer_size, и т.д.) ?

В целом, он отвечает утвердительно. Однако фактические данные зависят от вашего оборудования, ОС и того, какой механизм хранения вы используете. См. Главу 7.11 (особенно 7.11.4 в ссылке ниже)

Кроме того, первичный идентификатор сумасшедший рисунок они придумали в девяностых. [...] Интересно, есть ли что-нибудь, что я могу сделать, чтобы ускорить сортировку по этому вопросу конкретное поле (которое является порядком по умолчанию).

Может быть, вы могли бы добавить primarySortOrder столбец в таблицу, в которой можно хранить числовые значения, которые отображают порядок PK (precaluclated от процедуры магазина, который вы используете).

Ant ссылку вы так долго ждали: Chapter 7 from MySQL manual: Optimization

+0

Мне нравится идея столбца primarySortOrder. «электронная таблица превратилась в db» - да, на самом деле старый FileMaker Pro db превратился в MySQL db, но я не могу с этим поделать. Записи записываются в состояние и должны соответствовать точно - поля, которые могут быть десятичными, не могут быть (например, некоторые пользователи помещают «от 1 000 000 до 2 000 000 долларов» в поле затрат - это правило - это правило, а не исключение). Один последний q: если меня не волнуют запросы (например, выберите a из t, где a = 1 порядок по лимиту desc 25), а скорее начальное отображение (например, выберите a из t порядка по лимиту desc 25), есть ли любые стратегии, которые вы предложили бы? – momo

0

Добавить индекс для всех столбцов, которые имеют большое количество различных значений, скажем, 100 или даже 1000 или больше. Настройте это число, когда идете.

+0

спасибо за ответ. практически все столбцы будут отличаться - большинство из них являются свободными текстами. вы бы предложили индексировать их все? – momo

+0

@BigMoMo Возможно. Снижение производительности происходит при вставке или обновлении. Только вы знаете относительную частоту тех w.r.t. чтения и поиска. – EJP

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