亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

【原創】基于MySQL 水平分區的優化示例

標簽:
MySQL

   我们知道,MYSQL 5.1开始支持水平分区功能。 我们来尝试下如何在已经分区的表上面做查询优化。

总体来说,优化的原则和对单独的表做优化是一样的,保证对磁盘上表的扫描次数减小。

我们的表结构如下:

 

 

这里已经插入2W多行数据进行测试。

看看这条查询。

SELECT * FROM t1 WHERE system_type IN (1,2)

UNION ALL

SELECT * FROM t1 WHERE system_type = 3;

这条语句对system_type字段过滤了两次,然后进行了一次UNION ALL。 但是不知道,其实对两个分区一共进行了三次全表扫描。

我们改成这样:

 

SELECT * FROM t1 WHERE system_type IN (1,3)

UNION ALL

SELECT * FROM t1 WHERE system_type = 2;

看似简简单单的改变,我们把对两个分区的扫描从三次减少到了两次。 但是这样,开销也很大,能不能把UNION ALL去掉呢?当然可以。

SELECT * FROM t1 WHERE system_type >0 and system_type < 4;

去掉了UNION ALL,但是遇到的问题是对分区的扫描变成了范围查找,而且上下限不固定,相对来说,还有优化的空间。

我们改下对system_type列的过滤条件,变成如下:

SELECT * FROM t1 WHERE system_type in(1,2,3);

id  select_type table partitions  type  possible_keys key key_len ref rows  Extra

1 SIMPLE    t1    r0,r1   ALL \N        \N  \N    \N  17719 Using where

现在,依然是范围扫描,但是上下限就很明了了。这样对扫描分区来说,很快的找到上下限,比之前来的要快,开销来的要小点了。

但是貌似还可以优化, 虽然过滤条件的上下限明显了,但是对于区域之内的扫描还是全分区(相当于整个表的全表。)。 

OK,那现在给这个列加上索引吧。

 

ALTER TABLE t1 ANALYZE PARTITION r0,r1;

SELECT * FROM t1 WHERE system_type in(1,2,3);

id  select_type table partitions  type  possible_keys key     key_len   ref rows  Extra

1 SIMPLE    t1    r0,r1   range NewIndex1 NewIndex1 1     \N  6462  Using where

当然,我们的例子非常简单, 这里只是为了演示下在水平分区下如何进行SQL优化。

 

©著作权归作者所有:来自51CTO博客作者david_yeung的原创作品,如需转载,请注明出处,否则将追究法律责任

mysql优化sqlMySQL性能优化


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消