MySQL MyISAM проблема производительности таблицы вновь - PullRequest
0 голосов
/ 11 мая 2009

Этот вопрос относится к этому .

У меня есть таблица со следующей структурой:

CREATE TABLE  mydatabase.page (
  pageid int(10) unsigned NOT NULL auto_increment,
  sourceid int(10) unsigned default NULL,
  number int(10) unsigned default NULL,
  data mediumtext,
  processed int(10) unsigned default NULL,
  PRIMARY KEY  (pageid),
  KEY sourceid (sourceid)
) ENGINE=MyISAM AUTO_INCREMENT=9768 DEFAULT CHARSET=latin1;

В столбце data содержится текст размером около 80–200 КБ на запись. Общий размер данных, хранящихся в столбце data , составляет около 1,5 ГБ.

Выполнение этого запроса занимает 0,08 секунд:

select pageid from page

Но выполнение этого запроса занимает около 130.0 секунд:

select sourceid from page

Как видите, у меня есть первичный индекс для page.pageid и индекс для page.sourceid. Так должен ли второй запрос занимать ТО долго?

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

ОБЪЯСНИТЬ вернулся

id select_type table type  possible_keys key      key_len ref rows Extra
1  SIMPLE      page  index               sourceid 5           9767 Using index

Извините, но профилирование не работает ... MySQL (его 4.1.22) не распознал запрос SHOW PROFILE.

ПОКАЗАТЬ ИНДЕКС возвращается

Table Non_unique Key_name  Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
page  0          PRIMARY   1            pageid      A         9767                             BTREE 
page  1          sourceid  1            sourceid    A         3255                        YES  BTREE 

Ответы [ 3 ]

1 голос
/ 11 мая 2009

Вы пытались навязать использование индекса? Как:

SELECT sourceid FROM page USE INDEX (sourceid_index)

Как и комментарии sgehrig, проверьте, используя EXPLAIN, если индекс используется? И поделитесь результатом?

EXPLAIN select sourceid from page

Это может также помочь разделить определение индексов:

SHOW INDEX FROM page
0 голосов
/ 11 мая 2009

Поскольку MySQL 4.1.22 довольно старый (02 ноября 2006 г.), я подозреваю, что он не поддерживает понятие , охватывающее индексы для вторичных ключей. EXPLAIN показывает, что запрос фактически использует индекс, поэтому я предполагаю, что для чтения всех строк результата требуется дополнительное время (вместо простого возврата содержимого индекса при использовании охватывающих индексы ) для извлечения столбец sourceid.

У вас есть возможность проверить запрос на более новой версии сервера MySQL?

0 голосов
/ 11 мая 2009

Насколько отличаются ваши поля sourceid? Если у вас есть только несколько разных значений sourceid по сравнению с количеством строк, вы можете попробовать увеличить размер индекса.

...