MySQL: разделы производительности при объединении таблиц

У меня вопрос с разделами и объединением таблиц в MySQL. У меня есть образец схемы:

CREATE TABLE A (
`ID` BIGINT NOT NULL AUTO_INCREMENT,
`NAME` varchar(50) DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `IDX_A_NAME` (`NAME`),
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE B (
`ID` BIGINT NOT NULL AUTO_INCREMENT,
`VALUE` double(22,6) DEFAULT NULL,
`A_REF` BIGINT DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `IDX_A_REF` (`A_REF`),
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
PARTITION BY RANGE( A_REF ) (
                PARTITION p1000 VALUES LESS THAN (1000),
    PARTITION p2000 VALUES LESS THAN (2000),
    PARTITION p3000 VALUES LESS THAN (3000),
    PARTITION future VALUES LESS THAN MAXVALUE
                            );

В многораздельной таблице B увеличивается примерно на 3 миллиона строк в месяц. Критерии разделения по полю A_REF заключаются в том, что доступ к таблице B осуществляется с помощью таких запросов (на данный момент это не может быть изменено):

SELECT B.VALUE
FROM A
INNER JOIN B ON A.ID = B.A_REF
WHERE A.NAME = 'James'

Итак, мои вопросы

  • При выполнении EXPLAIN PARTITIONS ... с этим запросом, все разделы доступны в выводе EXPLAIN. Означает ли это, что все разделы фактически доступны во время выполнения? Или это только информация о разделах?
  • Помогает ли то, что критерием разделения было поле JOIN?
  • Помогает ли разметка в моем примере?
  • Есть ли какой-либо другой подход (другие критерии разделения и т. Д.), Который помогает получить доступ к меньшему количеству строк или запрос выполняется быстрее?

Меня беспокоит выполнение этого запроса в течение года с примерно 40 миллионами строк. Так что любая помощь очень ценится.


person yaki_nuka    schedule 24.11.2014    source источник


Ответы (1)


Чтобы ускорить этот запрос, избавьтесь от секционирования.

Удаление не удалось (я думаю), потому что у него не было константы, с помощью которой можно было бы выбрать раздел. Вместо этого JOIN проник во все разделы. Все, кроме одного, ничего не вернули, таблица с A_REF вернула строку (строки), как если бы это была несекционированная таблица.

Есть много случаев, когда разбиение на разделы не помогает производительности; Вы, кажется, нашли ту, где больно.

person Rick James    schedule 14.06.2015
comment
спасибо за ваше объяснение. Я не могу отметить ваш ответ как окончательный, но он полезен и имеет для меня смысл. Тогда спасибо. - person yaki_nuka; 16.06.2015