zoukankan      html  css  js  c++  java
  • MYSQL最左前缀原则

    建立联合索引后,数据库会生成一颗B+树,值是主键。

    回表:从联合索引表中查询到数据后,在回到主键表查询,避免数据冗余。

    CREATE TABLE `t1` (
      `id` int NOT NULL,
      `a` int DEFAULT NULL,
      `b` int DEFAULT NULL,
      `c` int DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `index_bc` (`b`,`c`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

    先任意插入12条数据

    第一种情况

    上图中查询表所有字段时,条件c遵循最左前缀原则。在b+中查询类似 *c,所以不使用索引查询,使用全表扫描。

     

     上图中,查询指定字段,并且遵循了最左原则,系统会自动优化。

     范围查询时,当查询的行数一旦过多,回表数量一旦增多,则不会使用索引。(系统内部自行判断回表成本和全文扫描查询成本)

      索引列不应该作为表达式的一部分,一旦对列改变后,就不能使用索引查询,对磁盘中的数据进行,会增大开销。

    order by 中索引

     查找字段覆盖索引字段

     查找字段没有覆盖索引字段

    一般情况下:where子句对于order 而言起到的是辅助作用

    一般FileSort方式的查询情况:

    1、检查的行数过多,且没有使用覆盖索引

    2、使用了不同的索引,MySQL每回只采用一个索引

    3、对索引列同时使用了ASC和DESC

    4、where语句与order by语句,使用了不同的索引

    需要先把a也设为索引

    5、where语句或者ORDER BY语句中索引列使用了表达式

    6、where 语句与ORDER BY语句组合满足最左前缀,但where语句中使用了条件查询

    7、order by子句中加入了非索引列,且非索引列不在where子句中

    8、order by或者它与where组合没有满足索引最左前列

    9、当使用left join,使用右边的表字段排序

  • 相关阅读:
    MFC 的资源文件 就是那个后缀名是 .rc的那个
    servlet 上下文
    servlet 会话技术
    页面分层
    分页技术 -servlet
    关于servlet连接数据库会出现空指针异常情况
    servlet 1
    (转)用户级和内核级线程
    (转)数据库分片Shard操作
    (转)系统设计题要考虑的方面
  • 原文地址:https://www.cnblogs.com/yewook/p/14486694.html
Copyright © 2011-2022 走看看