在大數據時代,面對海量數據存儲和處理,除了nosql方案外,很多時候還是需要關係型數據庫。mysql單表在千萬級別時性能就明顯下降,這時靠加索引等也難根本性解決,這時需要分庫分表。shardingshpere是一款輕巧綠色的分庫分表利器。不是它也是有侷限性,下面是它不支持的sql操作。
路由至多數據節點
不支持CASE WHEN、HAVING、UNION (ALL),有限支持子查詢。
除了分頁子查詢的支持之外(詳情請參考分頁),也支持同等模式的子查詢。無論嵌套多少層,ShardingSphere都可以解析至第一個包含數據表的子查詢,一旦在下層嵌套中再次找到包含數據表的子查詢將直接拋出解析異常。
例如,以下子查詢可以支持:
SELECT COUNT(*) FROM (SELECT * FROM t_order o)
以下子查詢不支持:
SELECT COUNT(*) FROM (SELECT * FROM t_order o WHERE o.id IN (SELECT id FROM t_order WHERE status = ?))
簡單來說,通過子查詢進行非功能需求,在大部分情況下是可以支持的。比如分頁、統計總數等;而通過子查詢實現業務查詢當前並不能支持。
由於歸併的限制,子查詢中包含聚合函數目前無法支持。
不支持包含schema的SQL。因爲ShardingSphere的理念是像使用一個數據源一樣使用多數據源,因此對SQL的訪問都是在同一個邏輯schema之上。
對分片鍵進行操作
運算表達式和函數中的分片鍵會導致全路由。
假設create_time
爲分片鍵,則無法精確路由形如SQL:
SELECT * FROM t_order WHERE to_date(create_time, 'yyyy-mm-dd') = '2019-01-01';
由於ShardingSphere只能通過SQL字面
提取用於分片的值,因此當分片鍵處於運算表達式或函數中時,ShardingSphere無法提前獲取分片鍵位於數據庫中的值,從而無法計算出真正的分片值。
當出現此類分片鍵處於運算表達式或函數中的SQL時,ShardingSphere將採用全路由的形式獲取結果。
示例
支持的SQL
SQL | 必要條件 |
---|---|
SELECT * FROM tbl_name | |
SELECT * FROM tbl_name WHERE (col1 = ? or col2 = ?) and col3 = ? | |
SELECT * FROM tbl_name WHERE col1 = ? ORDER BY col2 DESC LIMIT ? | |
SELECT COUNT(*), SUM(col1), MIN(col1), MAX(col1), AVG(col1) FROM tbl_name WHERE col1 = ? | |
SELECT COUNT(col1) FROM tbl_name WHERE col2 = ? GROUP BY col1 ORDER BY col3 DESC LIMIT ?, ? | |
INSERT INTO tbl_name (col1, col2,…) VALUES (?, ?, ….) | |
INSERT INTO tbl_name VALUES (?, ?,….) | |
INSERT INTO tbl_name (col1, col2, …) VALUES (?, ?, ….), (?, ?, ….) | |
UPDATE tbl_name SET col1 = ? WHERE col2 = ? | |
DELETE FROM tbl_name WHERE col1 = ? | |
CREATE TABLE tbl_name (col1 int, …) | |
ALTER TABLE tbl_name ADD col1 varchar(10) | |
DROP TABLE tbl_name | |
TRUNCATE TABLE tbl_name | |
CREATE INDEX idx_name ON tbl_name | |
DROP INDEX idx_name ON tbl_name | |
DROP INDEX idx_name | |
SELECT DISTINCT * FROM tbl_name WHERE col1 = ? | |
SELECT COUNT(DISTINCT col1) FROM tbl_name |
不支持的SQL
SQL | 不支持原因 |
---|---|
INSERT INTO tbl_name (col1, col2, …) VALUES(1+2, ?, …) | VALUES語句不支持運算表達式 |
INSERT INTO tbl_name (col1, col2, …) SELECT col1, col2, … FROM tbl_name WHERE col3 = ? | INSERT .. SELECT |
SELECT COUNT(col1) as count_alias FROM tbl_name GROUP BY col1 HAVING count_alias > ? | HAVING |
SELECT * FROM tbl_name1 UNION SELECT * FROM tbl_name2 | UNION |
SELECT * FROM tbl_name1 UNION ALL SELECT * FROM tbl_name2 | UNION ALL |
SELECT * FROM ds.tbl_name1 | 包含schema |
SELECT SUM(DISTINCT col1), SUM(col1) FROM tbl_name | 詳見DISTINCT支持情況詳細說明 |
SELECT * FROM tbl_name WHERE to_date(create_time, ‘yyyy-mm-dd’) = ? | 會導致全路由 |
DISTINCT支持情況詳細說明
支持的SQL
SQL |
---|
SELECT DISTINCT * FROM tbl_name WHERE col1 = ? |
SELECT DISTINCT col1 FROM tbl_name |
SELECT DISTINCT col1, col2, col3 FROM tbl_name |
SELECT DISTINCT col1 FROM tbl_name ORDER BY col1 |
SELECT DISTINCT col1 FROM tbl_name ORDER BY col2 |
SELECT DISTINCT(col1) FROM tbl_name |
SELECT AVG(DISTINCT col1) FROM tbl_name |
SELECT SUM(DISTINCT col1) FROM tbl_name |
SELECT COUNT(DISTINCT col1) FROM tbl_name |
SELECT COUNT(DISTINCT col1) FROM tbl_name GROUP BY col1 |
SELECT COUNT(DISTINCT col1 + col2) FROM tbl_name |
SELECT COUNT(DISTINCT col1), SUM(DISTINCT col1) FROM tbl_name |
SELECT COUNT(DISTINCT col1), col1 FROM tbl_name GROUP BY col1 |
SELECT col1, COUNT(DISTINCT col1) FROM tbl_name GROUP BY col1 |
不支持的SQL
SQL | 不支持原因 |
---|---|
SELECT SUM(DISTINCT col1), SUM(col1) FROM tbl_name | 同時使用普通聚合函數和DISTINCT聚合函數 |
如有侵權,請私信我刪除