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优化的主要内容,如果未能解决你的问题,请参考以下文章

如何优化C ++代码的以下片段 - 卷中的零交叉

从JVM的角度看JAVA代码--代码优化

部分代码片段

Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段

linux中怎么查看mysql数据库版本

从mysql的片段中加载ListView