- mysql架构优化,sql语句优化,mysql索引优化
mysql架构执行流程是
客户端-连接器(用户权限)-缓存(可以直接返回数据)
-分析器(语法分析)-优化器(生成执行计划索引选择)-执行器(操作索引返回结果集)
连接器 :主要是负责用户登录数据库,进行用户身份认证,权限操作,默认连接数据库最大8小时,超过这个时间需要重新连接,
缓冲区 :执行查询sql语句时,会先进行缓存中查询,如果sql之前执行过,会以key-value形式缓冲到内存中,
分析器:主要是分析sql语句是用来干嘛的,先分析词法就是判断关键字是用来对sql判断是什么类型,语法分析是sql是否正确,
优化器:优化器是如何执行sql是最优的,选择索引,多表查询关联顺序,
执行器:当选择好执行方案后,数据库开始执行sql语句,调用引擎,返回执行结果,
- 架构优化也就是将连接数据库的线程,做优化,并发线程很浪费线程占用cpu,做好连接池准备
- sql优化是提高查询效率,减少占用资源, sql优化就是指的是语句优化和索引执行
索引就是避免全表扫描,走索引查询,like关键字查询词第一个字符串不要通配符,这样会不走索引,
如果对where后面的列进行了计算,则不会走索引,对列进行了函数不会走索引,使用or要求是双方是索引,不然不走索引,使用union
大查询变成小查询,
在使用分页是可以进行排序
索引的优点是:能够提高查询效率,不使用索引就是从头到尾查询一遍,使用索引就是走小路,可以加快表与表连接的速度,
做条件判断的列做索引,
索引有普通索引 是查询块,唯一索引是唯一可以是null 主键索引是不能为null 不能重复,全文索引是char varchar text 字段建立索引,
不要在列上做判断,把计算放到业务层中,不要放到数据库中,
一张表的索引不要超过6个
使用between and in 才会走索引,
多表连接时是使用on还是where
大家都知道多表查询的方式有等值连接就是内连接,left outer join on rigth outer join on union合并
数据库在通过多表连接返回记录时,都会生成一张中间临时表,这个临时表就是查询出来的数据,返回给用户,
on条件是生成临时表时使用的条件,不管on中的条件是否为真,都会返回左表中的记录,
where条件是在生成临时表后在对表进行筛选的,这时就是要把不符合条件的过滤掉,
-
做mysql优化时一定要使用explain来查看sql执行计划
-
对应一般的多值查询注意
如果多个值是连续的要用between and 来进行查询,不连续可以使用in() ,但是in()里面的值不要太多,in中常量会存放在一个数组中,并排好序的,数值多的话会比较消耗资源, -
select语句后面务必要指明字段名称
select * 会增加不必要的消耗,而且还会放弃索引查询,维护起来比较麻烦, -
排序字段没有索引,就尽量不用用它来排序,
-
避免在where后面子句中对字段进行null值判断,
对于null的判断引擎会放弃索引进行全表扫描, -
避免在where后面对字段进行表达式操作,
对字段进行算术运算后引擎会放弃使用索引, -
关于join优化
left join 时A表是驱动表,
inner join 时 mysql会自动找那个数据量少的表为驱动表,
right join 时 B表是驱动表
在mysql优化时要注意要用小表驱动大表,被驱动表里建立索引,通过EXPLAIN分析来判断在sql中谁是驱动表,EXPLAIN语句分析出来的第一行的表即是驱动表。
由于mysql中没有全连接,可以使用这种方式来解决,select * from A union all select * from B -
mysql优化的方式
查询效率高的根本原因就是数据量少,字段宽度小,加索引,
索引就是一种表,保存了索引和主键的映射关系,
字段大小应该设置成合理的类型,注意数值型类型比文本类型查询要快,还要注意字段不要设置为null值,