• 在MySQL官方手册上,关于index merge的介绍非常非常少。甚至还有不少误导的地方,这次把5.1版本关于此类优化处理的代码细看了一遍,以案例的方式介绍了各种实用index merge访问类型的SQL。后续的还会继续介绍index merge实现的主要数据结构,以及成本评估。

    1. 什么是index merge

    MySQL优化器如果发现可以使用多个索引查找后的交集/并集定位数据,那么MySQL优化器就会尝试index merge这类访问方式。index merge主要分为两大类,多个索引交集访问(intersections),多个索引并集访问,当然这两类还可以组合出更为复杂的方式,例如多个交集后做并集。

    1.1 index merge的限制:range优先

    MySQL在5.6.7之前,使用index merge有一个重要的前提条件:没有range可以使用。这个限制降低了MySQL index merge可以使用的场景。理想状态是同时评估成本后然后做出选择。因为这个限制,就有了下面这个已知的bad case(参考):

    SELECT * FROM t1 WHERE (goodkey1 < 10 OR goodkey2 < 20) AND badkey < 30;

    优化器可以选择使用goodkey1和goodkey2做index merge,也可以使用badkey做range。因为上面的原则,无论goodkey1和goodkey2的选择度如何,MySQL都只会考虑range,而不会使用index merge的访问方式。这是一个悲剧…(5.6.7版本针对此有修复) (more…)

  • 前文着重介绍了MySQL的WHERE条件如何针对单个索引构造对应的SEL_ARG结构,本文是一个补充,将简单介绍多个索引对应的SEL_TREE结构。

    对于一个完整的WHERE条件,MySQL会遍历所有可以使用的索引,逐一构造其对应的SEL_ARG结构,所有的SEL_ARG结构以指针数组的形式存放在SEL_TREE->keys中。如果对应索引无法构造SEL_ARG,那么对应的指针为空。 (more…)

  • 在看MySQL优化器代码过程中,这应该是相对较简单/代码较清晰的部分了。MySQL优化器有两个自由度:单表访问方式,多表顺序选择。前文已经介绍过MySQL单表访问的一些考量(ref/range等),本文将介绍JOIN在顺序选择上的复杂度分析。

    当有多个表需要JOIN的时候,MySQL首先会处理两类特殊情况,一个是常数表,一个是由于外连接导致顺序依赖关系。前者总是放在关联的最前面,后者会在遍历的时候考虑。本文将忽略上面两点,从较宏观角度看JOIN顺序选择时候的复杂度。 (more…)

  • 在开始介绍index merge/ROR优化之前,打算先介绍MySQL是如何对range/ref做成本评估的。MySQL是基于成本(cost)模型选择执行计划,在多个range,全表扫描,ref之间会选择成本最小的作为最终的执行计划。仍然强烈建议先阅读登博的slide:《查询优化浅析》,文中较为详细的介绍MySQL在range优化时成本的计算。

    本文将继续介绍range/ref执行计划选择的一些不容忽略的细节。希望看客能够通过此文能够了解更多细节。 (more…)

  • 虽说是叫“东南亚旅游”,其实我只是去过马来西亚,希望这篇文章能慢慢丰富。

    如何获得亚航优惠打折信息?

    一般只要提前足够长的时间都可以获得相对便宜的机票。但是,有时候还是会做一些非常大力度的促销获得,例如推出0元机票等,只要在亚航的网站注册用户,用户名是你的邮箱,则亚航会把相关的信息发送到你的电子邮箱(这是我的主要渠道)。还可以关注亚航的微博帐号:亚航之家获得相关信息。

    英文不好能够预订亚航机票吗?

    现在亚航已经有了中文网站,使用中文版本已经可以直接完成预定了。但是,有些预订、管理页面还是会跳转到全英文的页面,高中英语水平足够了,不过只要有了翻译工具,英文水平也就无所谓了。

    亚航网站预订机票的主要流程有哪些?

    整个预订过程包括:

    搜索机票==>选择机票==>填写乘客信息==>选择亚航附加服务(保险、食物、额外托运等)==>付款

    没有完成付款,订单不会生效。

    亚航登机是否需要先做web check-in?

    这不是必须的,但是建议登机前一天做好web check-in。从2011年12月22日开始,亚航的国际航班柜台check-in不再需要额外的费用,但是亚航国内(马来西亚国内)航班仍然需要收取柜台check-in的费用,每人约10MR。(细则参考)

    亚航购买机票是否可以使用支付宝?

    现在(2012年2月)是可以的,这里列举了所有的亚航网站的支付方式:Payment channel。使用支付宝支付,可以帮用户省下一些Master/Visa支付时产生的手续费(有时候会是5或者10美元)。另外支付宝无需你在网站上填写信用卡号和CVV码,支付也更加简单。

    支付过程中如果如何选择支付宝付款?

    在最终进入支付页面后,选择币种为人民币(或者美元),然后点击下图中的apply按钮,就会出现支付宝连接。

    airasia.com payment with alipay

    护照没办好,是否可以购买出境机票?

    可以的。护照号可以在你完成机票预定后再补充上去。

    马来西亚签证如何办理?

    为了省事,我是通过旅行社办理的,400块一个人,小贵但省事。还可以通过淘宝上的商家代为办理,价格会便宜些。

    Lalla说,可以通过邮寄护照的方式办理,大约110块左右就搞定了。

    KLIA LCCT KLCC KL Sentral都是什么地方?

    KLIA是Kuala Lumpur International Airport(吉隆坡国际机场)的缩写(位置)。

    LCCT是Low Cost Carrier Terminal的缩写,是KLIA的一个很大的航站楼(参考)。

    KLCC是Kuala Lumpur City Centre的缩写,是吉隆坡最大的卖场,是双子塔所在的地方。

    KL Sentral是位于吉隆坡的一个交通中转站(也叫”吉隆坡中央车站“),有大巴,地铁,出租车等交通方式,附近也有很多酒店(参考)。

    在LCCT如何找到SkyBus?

    只需随便问一个LCCT工作人员或者商店店员,指指就能找到SkyBus了,你无需一个step-by-step的步骤。另外,SkyBus可以上车再买票,也无需提前买票(价格都是9RM)。

    在马来西亚如何打电话回家?

    出于成本考虑,建议到吉隆坡后重新购买一张本地的电话卡(据悉有Tune Talk、HOTLINK、DIGI等),打到国内一般也就0.25RM/每分钟(参考)。

    当然,也可以开通中国国内电话的国际漫游业务,但是,资费非常贵不说,需要押金1000元不说,即使回国了资费结算完成,1000元押金也要过两个月才能归还(这规定真是霸气啊),所以不推荐这样做。

    去马来西亚,我需要额外带什么行李吗?

    需要带一个”英标”插头转换器,另外看情况带上创可贴、感冒药;如果能有一个带GPS功能的手机地图将会非常方便你的出行(强烈建议)。

    去国外旅游会耽误学业或者工作吗?

    不会的。会享受生活,才更懂得在生活中创造价值。

  • 登博开了一个头,希望能够往前走一点。泛读了整个MySQL Range优化的相关代码,这里将总结Range优化相关的数据结构。本文不是从宏观(High Level)角度介绍Range优化相关内容,如果看客对此感兴趣,建议绕过本文,直接阅读参考文献,相信会有收获。

    已经连续写了几篇关于优化器相关的数据结构的博客了,只是希望需要的人是在需要的时候能够看到。

    1. 背景知识

    在开始介绍Range的主要数据结构之前,我们先看Range优化的一些概念和背景。依旧建议先阅读参考文件的[1-8],Sergey Petrunya写的PPT和文档质量都很高,很多图示,非常直观的展示了原理。

    (1) 什么是Range条件? 参考Range Optimization@MySQL Manual 单列Range多列Range

    (2) 给定一个KEY(key1)对应的WHERE条件,如何将其转化成一个Range,下面是”简述”,详细参考单列Range

    SELECT * FROM t1 WHERE (key1 < 'abc' AND (key1 LIKE 'abcde%' OR key1 LIKE '%b')) OR (key1 < 'bar' AND nonkey = 4) OR (key1 < 'uux' AND key1 > 'z');

    1.1 替换所有非RANGE查询为TRUE

    (more…)