SQL优化的方法
1 对查询进行优化, 尽量避免全表扫描, 首先考虑在where以及orderBy涉及到的列上建立索引
2. 避免在where子句中对字段进行null值的判断, 否则将导致引擎放弃使用索引进行全表扫描
3. 避免在where子句中使用!=或者<>操作, 否则引擎放弃使用索引进行全表扫描
4. 在使用索引字段作为条件时, 如果该索引是复合索引, name必须使用该索引中的第一个字段作为条件才能保证系统使用到了索引
5. 用exists代替in, 例如 select num from a where num in (select 1 from b ) 改为 select num from a where exists (select 1 from b where num = a.num)
6. 索引并不是越多越好, 一个表中最好不超过6个索引, 建立索引的依据是唯一性较强的字段, 频繁查询的字段, 有主见数据列的一定要建立索引
7. 尽量使用数字型字段, 若只含数字信息的字段尽量不要设计为字符型, 会降低查询和连接的性能.
8. 避免频繁创建和删除临时表, 以减少系统资源的消耗.
9. 避免大事务操作, 提供系统并发能力
如何保证命中索引
1. 最左匹配原则, 先定位sql的查询条件, 有哪些,那些是等值的, 那些是范围的条件, 等值的条件去命中索引最左边的一个字段, 然后依次从左往右命中,范围的放在最后.
SQL查询过程
先在where解析这一步把当前的查询语句中的查询条件分解成每一个独立的单元, Mysql会自动将sql拆分重组,然后where条件会在B-tree index这部分进行索引匹配, 如果命中索引,就会定位指定到table records位置, 如果没有命中, 则只能采用全部扫描的方式. 根据当前查询字段,返回对应的数据值
Mysql在什么情况下不会被命中索引
1. 如果条件中有or, 即使条件中有索引也不会使用
2. like查询开头以%, 索引不会命中
3. 如果列类型是字符串, 那一定在条件中将数据使用引号引起来,否则不会使用索引
4. 没有查询条件或者查询条件没有建立索引.
5. 查询条件中,在索引列上使用函数, 这种情况下需要建立函数索引
6. B-tree索引is null 不会走, is not null会走.
索引的分类
单列索引 最基本的索引
唯一索引: 允许所有类的键是唯一的, 可以存储空值,
主键索引: 不允许空值
组合索引 包含多个字段,但是只有一个索引名