1. 索引作用
    对字段建立索引可以大大提高查询速度。通过善用这些索引,可以令MySQL的查询和运行更加高效。不建索引,数据库全局扫描查找数据,建立索引后无需扫描,即刻找到相应数据。
  2. 索引类型
    索引包括单列索引和联合索引
    单列索引:使用多个单列索引查询时,优化器会选择最优索引策略,可能只用一个索引,也可能将多个索引全用上! 但多个单列索引底层会建立多个B+索引树,比较占用空间,也会浪费一定搜索效率,故如果只有多条件联合查询时最好建联合索引!
    联合索引遵循最左原则,当创建(a,b,c)联合索引时,相当于创建了(a)单列索引,(a,b)联合索引以及(a,b,c)联合索引,想要索引生效的话,只能使用 a和a,b和a,b,c三种组合;当然,a,c组合也可以,但实际上只用到了a的索引,c并没有用到!
    创建索引的原则:
    1、需要加索引的字段,要在where条件中
    2、数据量少的字段不需要加索引;因为建索引有一定开销,如果数据量小则没必要建索引(速度反而慢)
    3、避免在where子句中使用or来连接条件,因为如果俩个字段中有一个没有索引的话,引擎会放弃索引而产生全表扫描
    4、联合索引比对每个列分别建索引更有优势,因为索引建立得越多就越占磁盘空间,在更新数据的时候速度会更慢。另外建立多列索引时,顺序也是需要注意的,应该将严格的索引放在前面,这样筛选的力度会更大,效率更高
    5.建立联合索引时将频繁使用的放在左边
    ◆索引不会包含有NULL值的列
    只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
    ◆使用短索引
    对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
    ◆索引列排序
    MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
    ◆like语句操作
    一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
    ◆不要在列上进行运算
    select * from users where YEAR(adddate)<2007;
    将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成
    select * from users where adddate<‘2007-01-01’;
    ◆不使用NOT IN和<>操作
  3. 索引的原理
    建立索引即将列的数据复制在数据库中重新保存一份。
    索引的数据结构:平衡树,即B tree,B+ tree
    聚集索引:添加主键的表被存储为平衡树结构,查询时根据从根节点找到主键所对应的叶子节点再找到叶子节点对应行的数据

    非聚集索引:在表中创建的索引,先根据创建的索引找到所对应的主键,再根据聚集索引找到对应的数据,不管以任何方式查询表, 最终都会利用主键通过聚集索引来定位到数据, 聚集索引(主键)是通往真实数据所在的唯一路径。

    覆盖索引:创建聚合索引,查找的字段和过滤字段都建立了索引,不用再通过聚集索引从主键找到数据。

    参考:数据库索引原理