mysql索引浅谈

ew3y 10年前

索引的作用:
        提高数据检索效率
        提高聚合函数效率
        提高排序效率
        个别时候可以避免回表
        减少多表关联时扫描行数
        主键、唯一索引可以作为约束
        列定义为DEFAULT NULL时,NULL值也会有索引,存放在索引树的最前端部分
mysql 支持的索引:
    普通索引:create index idx_xxx on tb(xxx)   alter table tb add index idx_xxx(xxx)
              包括前缀索引 alter table yw add indx idx_c6_6(c6(6)) 减少一下索引的长度,让扫起来更省点IO
               在普通索引的列是可以NULL  索引不会包含有NULL值的列找
    唯一索引:是一种约束,要求字段是唯一的。 唯一索引列可以允许有NULL,但只能有一个
    主键索引:Innodb里聚集key,所有的数据以主建排序存储
    组合索引:
    全文索引:

什么情况不适用索引:
        通过索引扫描的记录数超过30%,变成全表扫描
        联合索引中,第一个索引列使用范围查询
        联合索引中,第一个查询条件不是最左索引列
        模糊查询条件列最左以通配符 % 开始
        内存表(HEAP 表)使用HASH索引时,使用范围检索或者ORDER BY
        两个独立索引,其中一个用于检索,一个用于排序
        使用了不同的 ORDER BY 和 GROUP BY 表达式
        两个表关联字段类型不一样(也包括长度不一样),5.1开始的版本已经不复存在了


复杂关联SQL的优化原则

        查询所返回的结果集,通常查询返回的结果集很少的,就比较容易优化;
        驱动表的选择至关重要,通过查看执行计划,可以看到优化器选择的驱动表,从执行计划中的rows可以大致反映出问题的所在;
        理清各表之间的关联关系,注意关联字段上是否有合适的索引;
        使用straight_join关键词来强制表之间的关联顺序,可以方便我们验证某些猜想;

DISABLE/ENABLE KEYS的作用
        只对MyISAM表有效
        导入大量数据之前,禁用索引
        加速数据导入效率
        导入完成后,再启用索引

 MySQL不支持函数索引、运算
        索引列上使用函数后,无法使用索引,可能导致全表扫描
        索引列上不能附加运算表达式,否则也无法使用索引

RAND()优化
        指导思想:从MySQL数据库中随机取一条或者N条记录时,最好把RAND()生成随机数放在JOIN子查询中以提高效率。
        SELECT id FROM table ORDER BY RAND() LIMIT n;
        =>优化
        SELECT id FROM table t1 JOIN (SELECT RAND() * (SELECT MAX(id) FROM table) AS nid) t2 ON t1.id > t2.nid LIMIT n;

范围查询:>、<、>=、<=、BETWEEN
等值查询:=  in

由于时间有限,乱七八糟的说了这么多也没有一个实例木有说服力。但是请大家记住:

MySQL优化的核心秘诀:
        核心概念: 减少IO(能不能用顺序IO)
        实际行动: 控制结果集大小,争取1秒完成


个人建议就不要用myisam:
    1.myisqm : CPU利用,只能用到一核
    2.内存: 只能缓存索引,最多只有用到4个G
    3.表级锁, 容易出现表crash