MySQL分庫分表是為了優化數據庫性能而進行的一種分布式存儲方式。分表的設計需要兼顧數據量和查詢效率,而查詢分表的方法也需要注重查詢效率。
在MySQL中,使用union all可以將多個查詢結果合并成一個表,從而可以實現跨表查詢,但是這種方式會影響查詢效率,因為需要掃描多個表。因此,查詢分表的最佳方法是使用MySQL提供的分區表。
CREATE TABLE mytable ( id INT NOT NULL, name varchar(20) NOT NULL, created_at DATETIME NOT NULL ) PARTITION BY RANGE( YEAR(created_at)*100 + MONTH(created_at) ) ( PARTITION p01 VALUES LESS THAN (202101), PARTITION p02 VALUES LESS THAN (202102), PARTITION p03 VALUES LESS THAN (202103), PARTITION p04 VALUES LESS THAN (202104), PARTITION p05 VALUES LESS THAN (202105), PARTITION p06 VALUES LESS THAN (202106), PARTITION p07 VALUES LESS THAN (202107), PARTITION p08 VALUES LESS THAN (202108), PARTITION p09 VALUES LESS THAN (202109), PARTITION p10 VALUES LESS THAN (202110), PARTITION p11 VALUES LESS THAN (202111), PARTITION p12 VALUES LESS THAN (202112) );
以上代碼定義了一個分區表,按照created_at字段的年月進行分表。查詢的時候,只需要在WHERE條件中添加created_at字段的限制就可以只掃描對應的分區表。
SELECT id, name, created_at FROM mytable PARTITION (p01) WHERE created_at >= '2021-01-01' AND created_at< '2021-02-01';
以上代碼查詢的結果只會掃描p01分區表,大大提高了查詢效率。