/*
 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 (常用数据放到缓存里,提高取数据速度)
 */