/*
 7>. 索引:
     1. 索引的数据结构: B+树
        二分查找 + 平衡二叉树

     2. 索引的最左匹配原则: 按照从左到右的顺序建立搜索树
        (name,age,sex) 先比较name, 如果name相同则继续比较age和sex, 直到得到数据
        (age,sex)      不会按照最左匹配原则
        (name,sex)     找到name, 然后获得该name的所有age值, 再匹配sex

     3. 聚集索引和辅助索引
        聚集索引: 按照每张表的主键来构造搜索树, 每张表只有一个聚集索引
                优点: 它对主键的排序查找和范围查找速度非常快
                     范围查询(range query)
        辅助索引: 非聚集索引, 辅助索引的叶子节点不包含行记录的全部数据
                每张表上可以有多个辅助索引, 但只能有一个聚集索引

     4. 常用的索引
        1>>. 普通索引: 加速查询  INDEX (charger_id);
        2>>. 唯一索引:
                    主键索引: 加速查找 + 约束(不能为空, 不能重复)
                            PRIMARY KEY
                    唯一索引: 加速查找 + 约束(不能重复)
                            UNIQUE INDEX (charger_id);

        3>>. 组合索引:    INDEX(id, name, age);        // 效率比唯一索引低


     5. 索引未命中:
        1) like '%xx'
        2) 定位条件使用函数
        3) or: 从左到右依次执行
        4) 定位条件与创建索引的类型不一样
        5) !=, 定位范围过大
        6) >
        7) order by 选择的映射如果不是索引,则不走索引
        8) 组合索引最左前缀失效

    6. 覆盖索引:
        即从辅助索引中就可以得到查询记录,而不需要查询聚集索引中的记录。 辅助索引大小远小于聚集索引, 因此可以减少大量的IO操作


                  索引设计原则:
                       1. 最适合的索引列, 出现在WHERE中和连接句子中的列
                       2. 使用唯一索引,索引列的基数越大,索引效果越好,因此往往用unique列做索引
                       3. 使用短索引,尽量缩短index(col(length))的length
                       4. 使用组合索引
    7. 索引合并:
       索引合并,让一条sql可以使用多个索引。对这些索引取交集,并集,或者先取交集再取并集。
       从而减少从数据表中取数据的次数,提高查询效率
 */

/*
数据库的优化方案:
    1. 创建数据表时把固定长度的放在前面
    2. 将固定数据放入内存: 例如:choice字段
    3. 联合索引遵循最左前缀(从最左侧开始检索)
    4. 避免使用 select *
    5. 读写分离:利用数据库的主从进行分离:主,用于删除、修改更新;从,用于查
    6. 分库: 当数据库中的表太多,将某些表分到不同的数据库
    7. 分表:
           水平分表:将某些列拆分到另外一张表,例如:博客+博客详情
           垂直分表:讲些历史信息分到另外一张表中,例如:支付宝账单
    8. 加缓存: 利用redis、memcache (常用数据放到缓存里,提高取数据速度)
 */