• MySQL的索引


    • 每一个索引就对应着一棵树
    (1) 主键:MySQL会以主键的值构造一棵树,其叶子节点存放着该主键对应的整行数据。因此一张表在数据结构上就等价于一颗以主键排序好的树
    (2)辅助索引:自己建的索引一般都叫辅助索引,辅助索引树的叶子节点存放着两样东西,即辅助索引字段的值以及它所对应的主键值。因此当走辅助索引时,先从辅助索引树找到所需的主键,再到主键树上取出整行数据中的所需字段。举个例子,设ID为主键,updatetime为辅助索引,name无索引,体味下下面两条查询的不同:
    select ID from table where updatetime = today
    select name from table where updatetime = today
    前者直接在辅助索引树的叶子节点取出ID就返回了,后者还要再去主键树根据ID取name
    (3)联合索引:如KEY(updatetime, name),则辅助索引树的叶子节点存放着(updatetime,name,ID)并先按updatetime排序好,updatetime相同再按name排序。所以此时查询:select xx from table where name = xx是没法走这个联合索引的,但若是:select xx from table where updatetime = today order by name就很屌了,因为当根据updatetime = today取出来的rows已经按name排序好了

    • 一次查询同一张表的话,只能用一条索引
    (1)MySQL会很只能的去分析走哪条索引扫描量少,然后选择一条最优的索引进行select。因此若是表建了一些奇奇怪怪的索引时,反倒会干扰MySQL的分析
    (2)对于一些区分度不高的索引,如status、type这类只有几个值的字段,建索引就没意义了(索引树的树杈太少)
    (3)可以在查询时强制指定使用某一个索引,如select xx from xx FORCE INDEX(IX_updatetime),就会强制使查询走IX_updatetime这个索引

    • 查询别乱写,否则容易导致查询无法使用索引
    (1)like查询时,通配符“%”放在最前面时无法使用索引
    select xxx like ‘%abc’无法走索引,select xxx like ‘a%bc’可以走索引
    (2)对列的函数运算无法走索引
    select xxx where md5(password) = ‘xxx’无法走索引
    (3)OR子句也用不到索引
    (4)等等很多情况 
  • 相关阅读:
    es进行聚合操作时提示Fielddata is disabled on text fields by default
    es基本操作
    maven项目修改项目名
    Linux命令整理
    CentOS 安装git
    Linux命令
    纵表转横表
    Row_Number() over()
    事件冒泡/捕获
    js获取参数 解决乱码
  • 原文地址:https://www.cnblogs.com/dosmile/p/6444411.html
Copyright © 2020-2023  润新知