Как быстро отсортировать записи в MySQL? - PullRequest
1 голос
/ 26 июня 2011

У меня есть база данных более 2 000 000 записей.Мне нужно иметь возможность быстро сортировать по любому из 30 полей в таблице.

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

Вот моя структура таблицы:

CREATE TABLE `tblM` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`fld1` varchar(1024) NOT NULL,
`fld2` varchar(1024) NOT NULL,
 ...
 PRIMARY KEY (`id`),
 KEY `fld1` (`fld1`(1000)),
 KEY `fld2` (`fld2`(1000)),
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=21748375 ; 

Это пример запроса, который я выполняю:

SELECT id, fld1, fld2 FROM tblM ORDER BY fld2 ASC LIMIT 30 

Однако выполнение занимает около 15 секунд.Есть ли способ, с помощью которого эти типы запросов могут выполняться за <1 сек? </p>

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

Ответы [ 5 ]

1 голос
/ 26 июня 2011
  1. Я не думаю, что индекс будет иметь значение, если вы не применяете фильтр (предложение where)
  2. 2 000 000 строк с полями размером 1024 - это не маленькая таблица,так что отчасти это зависит от аппаратного обеспечения
  3. Какова скорость, если вы запустите его снова?Возможно, кэширование улучшит его производительность.
  4. Можете ли вы использовать InnoDB вместо MyISAM?

Редактировать


  1. Эта статья была написанаНекоторое время назад, так что я не уверен, что это все еще применяется, но это было информативно, когда это вышло.Здесь обсуждается различие между InnoDB и MyISAM в отношении кластерных индексов.http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/

  2. Попробуйте использовать USE INDEX или FORCE INDEX:

    SELECT id, fld1, fld2 FROM tblM USE INDEX (fld2) ORDER BY fld2 ASC LIMIT 30
    

    или

    SELECT id, fld1, fld2 FROM tblM FORCE INDEX (fld2) ORDER BY fld2 ASC LIMIT 30
    
0 голосов
/ 26 июня 2011

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

SELECT id, fld1, fld2 FROM tblM ORDER BY fld2 ASC LIMIT 30 

Вы можете создать этот индекс:

create index ix_tblM_fld2 on tblM (fld2, fld1, id)

Вот один совет:

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

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

0 голосов
/ 26 июня 2011

вы пытаетесь отсортировать по 1024 длины varchar? это много потенциальной работы ...

Можете ли вы сойтись с сортировкой по первым 10 символам? Я не проверял это в MySQL, но если вы создали поле fld1_short, которое было varchar (10), и заполнили его первыми 10 символами fld1, и , то создали индекс для него, это может дать лучшую производительность.

Возможно, вы захотите ознакомиться с MySQL doco , касающимся оптимизации ORDER BY - вы вполне можете использовать настройки sort_buffer_size и / или read_rnd_buffer_size, учитывая объем данных, которые вы работа с.

0 голосов
/ 26 июня 2011

Попробуйте изменить двигатель с MYISAM на INNODB.

0 голосов
/ 26 июня 2011

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

...