sql优化和索引

1、选择数据类型遵循小而简单的原则
越小的数据类型通常会越快,占用更少磁盘、内存,处理时所需要的CPU周期也更少。
例如:使用整形存储ip地址,使用DATATIME存储时间。
2、如果一个列计划创建索引,最好设置为NOT NULL
3、INT类型长度固定4个字节32位,对他指定宽度,只会影响显示的长度,实际占用还是4字节。
4、对于状态码,推荐使用TYININT(1),占用1个字节,可以节省很多空间。

explain是查看优化器如何决定执行查询的主要方法。可以帮助我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。
explain select SQL_NO_CACHE id,name from user where id=1
执行语句将会得到一系列这个sql语句执行信息。

返回信息

其中我们需要关注的是type和rows。
type是这句sql语句执行类型,好坏程度依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般来说,好的sql查询至少达到range级别,最好能达到ref。
rows是扫过的行数,这个值越贴近最终查询出的行数越好。

sql优化的具体形式,就是索引。
mysql5.5及以上版本默认使用InnoDB作为搜索引擎。相比较于MyISAM,InnoDB支持外键、行锁、事务。(注意,行锁是建立在命中索引的情况下)

索引由两种:聚集索引和非聚集索引。

聚集索引是以主键为查找key,在建表时默认创建的索引,在B+结构中,所有的叶子节点存储的是该id的记录全部数据,这里引入覆盖索引的概念:覆盖索引时sql查询时如果索引已经存储了这次sql想要查询的全部字段信息,则命中索引之后直接返回,查询速度很快。

非聚集索引,就是自定义索引,创建索引的字段不同会引起不同的效果。
1)最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
2)=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式。

你可能感兴趣的:(sql优化和索引)