Справка по структуре MySQL для объединений (большие таблицы)

0

В настоящее время у меня есть 2 таблицы, которые используются для запроса select с простым соединением. В первой таблице находится около 6-9 миллионов строк, и это используется как соединение. Первичная таблица составляет от 1 до 300 мил. Тем не менее, я замечаю, что когда я соединяю более 10 мил строк в первичной таблице, запрос выбора идет от моментального до очень медленного (3 + секунды и растет).

Вот моя структура таблицы и запросы.

CREATE TABLE IF NOT EXISTS `links` (
  `link_id` int(10) unsigned NOT NULL,
  `domain_id` mediumint(7) unsigned NOT NULL,
  `parent_id` int(11) unsigned DEFAULT NULL,
  `hash` int(10) unsigned NOT NULL,
  `url` text NOT NULL,
  `type` enum('html','pdf') DEFAULT NULL,
  `processed` enum('N','Y') NOT NULL DEFAULT 'N',
  UNIQUE KEY `hash` (`hash`),
  KEY `idx_processed` (`processed`),
  KEY `domain_id` (`domain_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;


CREATE TABLE IF NOT EXISTS `domains` (
  `domain_id` mediumint(7) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(170) NOT NULL,
  `blocked` enum('N','Y') NOT NULL DEFAULT 'N',
  `count` mediumint(6) NOT NULL DEFAULT '0',
  `mcount` mediumint(3) NOT NULL,
  PRIMARY KEY (`domain_id`),
  KEY `name` (`name`),
  KEY `blocked` (`blocked`),
  KEY `mcount` (`mcount`),
  KEY `count` (`count`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10834389 ;

Query:

(SELECT link_id, url, hash FROM links, domains WHERE links.domain_id = domains.domain_id and mcount > 1 and processed='N' limit 200) 
UNION
(SELECT link_id, url, hash FROM links where processed='N' and type='html' limit 200)

Объясните выбор:

| id | select_type  | table      | type  | possible_keys           | key      |     key_len | ref                       | rows    | Extra       |
+----+--------------+------------+-------+-------------------------+---------------        +---------+---------------------------+---------+-------------+
|  1 | PRIMARY      | domains    | range | PRIMARY,mcount          | mcount        | 3       | NULL                      |  257673 | Using where | 
|  1 | PRIMARY      | links      | ref   | idx_processed,domain_id | domain_id     | 3       | crawler.domains.domain_id |       1 | Using where | 
|  2 | UNION        | links      | ref   | idx_processed           | idx_processed | 1       | const                     | 7090017 | Using where | 
| NULL | UNION RESULT | <union1,2> | ALL   | NULL                    | NULL          | NULL    | NULL                      |    NULL |             | 
+----+--------------+------------+-------+-------------------------+---------------+---------+---------------------------+---------+-------------+

Прямо сейчас, я пытаюсь создать раздел с 20 разделами в ссылках с использованием domain_id в качестве ключа.

Приветствуются любые другие варианты.

  • 0
    Это первый запрос, где происходит медлительность, а не второй. Я должен упомянуть, что раньше. Сожалею.
  • 0
    Не могли бы вы также описать свои индексы и показать, какие поля и из какой таблицы получены в медленном запросе.
Теги:
performance
join

2 ответа

0

Когда ситуация внезапно замедляется, вы можете проверить размер ваших индексов (используемых в выполнении запроса) и размер различных буферов mysql.

0

Один оператор SELECT заменит весь ваш оператор UNION:

SELECT link_id, url, hash
FROM links, domains 
WHERE links.domain_id = domains.domain_id 
      AND mcount > 1
      AND processed='N' 
      AND type='html'

Это не может быть ответ, который вы ищете, но он должен помочь вам упростить ваш вопрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню