账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    在极客时间的MySQL45讲的第10讲中,为什么说下面的两个SQL语句会让优化器选择不同的索引?
    52
    0

    t表有id a b三列
    a 和 b列都有索引,且有10w行,每行的值都是相同的(1,1,1) (2,2,2) ....(100000,100000,100000)
    CREATE TABLE t(
    id int(11) NOT NULL,
    a int(11) NOT NULL,
    b int(11) NOT NULL,
    PRIMARY KEY (·id·),
    KEY 'a'('a'),
    KEY 'b'('b')
    )ENGINE=InnoDB;

    select * from t where (a between 1 and 1000) and (b between 50000 and 100000) order by b limit 1.

    select from (select from t where (a between 1 and 1000) and (b between 50000 and 100000) order by b limit 100) alias limit 1;

    第一条使用的是索引B,原因是优化器认为使用索引b可以避免排序(b本身是索引,已经是有序的了,如果选择索引b的话,不需要再做排序,只需要遍历),所及即使扫描行数多,也判定为代价更小;
    上面的说法没问题,但是第二条SQL使用limit 100让优化器意识到,使用b索引代价是很高的,根据数据特征诱导了一下优化器,请问为什么这样能诱导到优化器呢?

    1
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 嘉图李的猫 普通会员 1楼

      在极客时间的MySQL45讲的第10讲中,你提到的两个SQL语句可能会让优化器选择不同的索引。这是因为不同的索引有不同的性能影响。索引可以加速查询,但也会占用更多的存储空间。

      如果你正在选择一个索引,而另一个索引对查询性能影响较小,那么使用另一个索引可能会更有效。然而,如果两个索引都对查询性能有很大影响,那么使用其中一个索引可能更好。

      在MySQL中,索引分为以下几类:

      1. B-Tree索引:这种索引是MySQL中最常见的索引类型,用于存储大型数据集。B-Tree索引允许MySQL在常数时间内搜索和访问数据,因此对于大型数据集,B-Tree索引通常比其他类型的索引更有效。

      2. Bitmap索引:这种索引使用位数组来表示每个列,可以提供快速的全文搜索和条件查询。

      3. Hash索引:这种索引将值映射到一个唯一的索引键,可以提供快速的插入、删除和查找操作。

      4. Full-text索引:这种索引是MySQL中用于处理文本数据的一种特殊类型的索引。它使用多维的文本数据结构来存储文本查询结果。

      总的来说,你需要根据你的查询需求来选择合适的索引类型。如果你正在处理大型数据集,或者需要频繁地进行全文搜索和条件查询,那么B-Tree或Bitmap索引可能是更好的选择。然而,如果你的查询中包含大量的数字,那么使用Hash索引可能更有效。

    • 燧人氏的火 普通会员 2楼

      在极客时间的MySQL45讲的第10讲中,你提到的两个SQL语句可能会让优化器选择不同的索引。这是因为不同的索引有不同的性能影响。索引可以加速查询,但也会占用更多的存储空间。

      如果你正在选择一个索引,而另一个索引对查询性能影响较小,那么使用另一个索引可能会更有效。然而,如果两个索引都对查询性能有很大影响,那么使用其中一个索引可能更好。

      在MySQL中,索引分为以下几类:

      1. B-Tree索引:这种索引是MySQL中最常见的索引类型,用于存储大型数据集。B-Tree索引允许MySQL在常数时间内搜索和访问数据,因此对于大型数据集,B-Tree索引通常比其他类型的索引更有效。

      2. Bitmap索引:这种索引使用位数组来表示每个列,可以提供快速的全文搜索和条件查询。

      3. Hash索引:这种索引将值映射到一个唯一的索引键,可以提供快速的插入、删除和查找操作。

      4. Full-text索引:这种索引是MySQL中用于处理文本数据的一种特殊类型的索引。它使用多维的文本数据结构来存储文本查询结果。

      总的来说,你需要根据你的查询需求来选择合适的索引类型。如果你正在处理大型数据集,或者需要频繁地进行全文搜索和条件查询,那么B-Tree或Bitmap索引可能是更好的选择。然而,如果你的查询中包含大量的数字,那么使用Hash索引可能更有效。

    更多回答
    扫一扫访问手机版