› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
Specs
V2EX  ›  MySQL

关于 MySQL 索引的几个问题

  •  
  •   Specs ·
    dotSpecs · Apr 7, 2016 · 3778 views
    This topic created in 3822 days ago, the information mentioned may be changed or developed.

    在看 http://tech.meituan.com/mysql-index.html 这篇文章的时候,里面写到创建索引的几大原则中有一条是:

    最左前缀匹配原则,非常重要的原则, mysql 会一直向右匹配直到遇到范围查询(>、<、 between 、 like)就停止匹配,比如 a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引, d 是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到, a,b,d 的顺序可以任意调整。

    没看明白为什么“(a,b,c,d)顺序的索引, d 是用不到索引的”,而“如果建立(a,b,d,c)的索引则都可以用到”。不是“遇到范围查询(>、<、 between 、 like)就停止匹配”吗,那为什么第二种方式创建索引 d 就能用到索引?

    还有个问题,只有 = 号的时候才会用到索引吗?还有其他操作可以用索引吗?

    6 replies  •  2016-04-10 19:14:30 +08:00
    hello2t
        1
    hello2t  
       Apr 7, 2016
    因为 mysql 内有查询优化,会调整查询条件的顺序。
    Infernalzero
        2
    Infernalzero  
       Apr 7, 2016
    你查询语句条件的顺序不影响索引的使用,mysql 会自动优化,看的是加的联合索引的字段顺序
    当然不是只有=号才用索引了,范围查询也会用到的,但不一定用,得 explain 看了,有时候 possible key 会包含对应的索引,但是实际并没有使用, mysql 自己会判断,存在某些特殊情况要 force index 或者 use index ,毕竟程序定的规则不可能覆盖所有情况
    Specs
        3
    Specs  
    OP
       Apr 7, 2016
    @hello2t @Infernalzero 多谢,关于第一个明白了。

    @Infernalzero 你说的“范围查询”是指的哪些情况呢? between ? in ?还是什么呢?
    Infernalzero
        4
    Infernalzero  
       Apr 7, 2016
    Specs
        5
    Specs  
    OP
       Apr 8, 2016
    @Infernalzero 多谢~
    paperen
        6
    paperen  
       Apr 10, 2016
    @Specs @Infernalzero 问下如果分别给 a 、 b 、 c 、 d 字段加索引 与 使用组合索引 在优化上会有什么区别?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2501 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 04:07 · PVG 12:07 · LAX 21:07 · JFK 00:07
    ♥ Do have faith in what you're doing.