mysql索引浅谈
索引的作用:
提高数据检索效率
提高聚合函数效率
提高排序效率
个别时候可以避免回表
减少多表关联时扫描行数
主键、唯一索引可以作为约束
列定义为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