У меня вопрос с разделами и объединением таблиц в 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 миллионами строк. Так что любая помощь очень ценится.