mysql索引浅谈_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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值