Простая таблица MySQL, выполняющая медленные запросы - PullRequest
3 голосов
/ 29 мая 2009

У меня очень простая таблица с двумя столбцами, но в ней 4,5 млн строк.

CREATE TABLE `content_link` (
  `category_id` mediumint(8) unsigned NOT NULL,
  `content_id` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`content_id`,`category_id`),
  KEY `content_id` (`content_id`,`category_id`)
) ENGINE=MyISAM;

Когда я запускаю простой запрос вроде:

SELECT
    *   
FROM
    content_link
WHERE
    category_id = '11';

mysql запускает процессор и занимает 2-5 секунд, прежде чем возвращает около 10 строк. Данные распределяются очень равномерно по всей таблице, и я обращаюсь к индексированным полям (я также анализировал / оптимизировал таблицу и никогда не меняю содержимое таблицы), так почему же этот запрос занимает так много времени?

Редактировать: Мне кажется, что Navicat лгал мне, и мой первичный ключ не был введен в правильном порядке, поскольку он отображал мне таблицу.

Ответы [ 3 ]

8 голосов
/ 29 мая 2009

category_id не первый столбец в любом индексе.

Создайте свой вторичный ключ следующим образом:

UNIQUE KEY `ix_category_id` (`category_id`, `content_id`)

Обратите внимание на порядок столбцов, это имеет значение.

2 голосов
/ 11 июня 2009

Порядок UNIQUE KEY - хорошее решение, и вам следует добавить стратегию разбиения в таблицу.

Разделив таблицу на фрагменты, MySQL запросит определенный раздел с правильным набором данных. Я подал заявку и у меня были отличные результаты.

CREATE TABLE ti (id INT, amount DECIMAL(7,2), tr_date DATE)
ENGINE=INNODB
PARTITION BY HASH( MONTH(tr_date) )
PARTITIONS 6;

Вам нужен MySQL 5.1.

Попробуйте http://dev.mysql.com/doc/refman/5.1/en/partitioning.html

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

Вы не используете индекс. Если у вас есть составной индекс, например (content_id, category_id), вы можете использовать индекс с помощью content_id или вы можете использовать content_id и category_id. Вы не можете использовать category_id и использовать индекс.

Попробуйте изменить:

KEY `content_id` (`content_id`, `category_id`)

до

KEY `category_id` (`category_id`, `content_id`)
...