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

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

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    MySQL表的列数不同, 匹配最左前缀的执行效果也不同?
    40
    0

    生成表和索引的sql:

    DROP SCHEMA IF EXISTS sakila;
    CREATE SCHEMA sakila;
    USE sakila;
    
    CREATE TABLE payment (
      payment_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
       
      -- 取消注释下面的列, 会对explain的结果产生影响
      -- customer_id SMALLINT UNSIGNED NOT NULL,
    
      amount DECIMAL(5,2) NOT NULL,
      payment_date DATETIME NOT NULL,
      last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      constraint id_UNIQUE
            unique (payment_id)
    );
    
    
    alter table payment add index
    idx_union_index_test (amount, payment_date, last_update);

    explain:

    explain select * from payment where
    payment_date ='2006-02-15 22:12:32' 
    and last_update = '2006-02-15 22:12:32';

    疑问:
    如果注释掉customer_id列, 执行explain发现是使用了索引 idx_union_index_test 的, 但是根据"匹配最左前缀"原则, 应该无法利用到索引的啊
    如果取消注释customer_id列, 再次生成表和索引并explain, 这个时候发现type=ALL了

    为什么会产生这样不同的结果呢?

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 無人相依偎 普通会员 1楼

      在MySQL中,最左前缀匹配的规则是指在字符串中,左侧第一个字符与模式匹配时,查询将返回第一个匹配项的值。例如,如果模式为"apple",在字符串"apple apple banana"中,最左前缀匹配的结果将是"apple",因为左侧第一个字符"p"与模式匹配。

      对于列数不同的表,最左前缀匹配的执行效果取决于以下几个因素:

      1. 表的列数:表中的列数越多,越难以找到最左前缀匹配的项。这是因为随着列数的增加,字符串的长度也会增加,查询的字符串长度也会增加,这将使最左前缀匹配变得更加困难。

      2. 数据类型:不同的数据类型可能会对最左前缀匹配产生影响。例如,字符串数据类型(如TEXT、CHAR等)通常允许字符串的长度不超过80个字符,这将限制最左前缀匹配的最大长度。如果表中的列数非常大,可能需要使用其他方法(如子查询、索引等)来提高查询性能。

      3. 字符集:某些字符集可能不支持最左前缀匹配。例如,一些字符集可能不支持左连接操作符(如LEFT JOIN、LEFT OUTER JOIN等),或者不支持特殊的字符,如反引号(')等。这些字符集可能会导致最左前缀匹配的执行效率较低。

      4. 数据库索引:在某些情况下,创建索引可以显著提高最左前缀匹配的执行效率。索引可以将模式作为查询的一部分,使其在表中的行数较少,从而提高查询性能。然而,创建索引需要在表中创建索引结构,并且索引的使用策略(如在左连接操作符中使用索引还是不使用索引)需要根据表的特点和查询需求进行决策。

      综上所述,最左前缀匹配的执行效果可能受到表的列数、数据类型、字符集以及数据库索引等因素的影响。在实际应用中,需要根据具体的情况和需求,选择合适的匹配策略,以提高查询性能和效率。例如,对于列数较小、数据类型较简单的表,可以考虑使用"match"关键字来匹配模式,或者在子查询或联接操作符中使用索引,以提高最左前缀匹配的效率。对于列数较大、数据类型复杂或需要动态调整匹配策略的表,可能需要使用其他方法(如子查询、索引等)来提高匹配效率。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部