mysql优化
Posted 北海
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql优化相关的知识,希望对你有一定的参考价值。
一、expain计划分析
二、创建索引
单值索引:一个索引只包含单个列,一个表可以有多个单值索引,一般来说, 一个表建立索引不要超过5个
唯一索引:索引列的值必须唯一,但允许有空值,一般是主健
复合索引:一个索引包含多个列
全文索引:mysql全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度
//创建复合索引 CREATE INDEX index_name_deptId_salary ON employee(NAME , dept_id , salary);
三、具体优化
1、max
一般创建索引解决
2、count
count统计时,如果是count(*),则会把空null行也统计进去,count(字段名),则不会把null字段统计进去,创建索引和max一样
3、order by,排序如何避免using filesort
-
第一种情况分析,建立索引,顺序如下 (name,age,salary)
-
第三种情况
4、group by,分组如何避免using temporary,其遵守的规则与order by 一样
5、limit
6、in与exists,小表驱动大表
连接5次,操作5000次,连接最消耗资源的 for(int i=0; i<5; i++){ for(int i=0; i<5000; i++){ } }
select * from t1 where id in (select id from where t2) 执行顺序是,先t2,再t1,t2是小表,t1是多大表 for(t2){ for(t1){ } }
select * from t1 where exist (select 1 from where t2.id = t1.id) 执行顺序是,先t1,再t2,t2是小表,t1是多大表,所以这种就会t1大表驱动小表,不推荐 for(t1){ for(t2){ } }
四、正确使用索引
1、全值匹配(最好)
建立复合索引(name,dept_id,salary)
CREATE INDEX index_name_deptId_salary ON employee(NAME , dept_id , salary); -- 创建复合索引
SHOW INDEX FROM employee;
2、最佳左前缀法则
如果索引有多列,要遵守最左前缀法则,指的就是按创建索引的顺序最左列开始 并且不跳过索引中的列
3、不在索引列上做任何操作
4、范围条件右边的索引失效
5、!=或者<>及is not null
6、or引起索引失效
7、like引起索引失效
尽量使用覆盖索引 查询的字段和建立索引的字段刚好吻合,这种我们称为覆盖索引(覆盖索引后即可解决索引失效)
8、字符串不加引号索引失效
EXPLAIN SELECT * FROM employee WHERE NAME = \'110\';
联合索引与单值索引有区别:https://blog.csdn.net/qq_40646143/article/details/79141979
以上是关于mysql优化的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段