Mysql 优化视频的方法:

1.mysql  执行计划与索引的详解.

简单实用:

explain中字段详解:

一. id  列

二。select_type列

三,table 列

四:type 列

五:possible_keys列

六:key 列

七:key_len: 列

八:ref 列

九:rows

十: extra 列

索引的最佳的实践:

表结果:

最佳实践:

一。全职匹配:

二:最佳的左前缀的法则

三。不在的索隐裂的走任何操作(计算,函数,(自动or 手动) 类型转换的),会导致的

索引而转向全表扫描

四:尽量实用覆盖索引(只访问索引的索引)(索引的包含列),减少select * 语句。

五: 尽量使用覆盖索引的(只访问的索引的查询(索引的列包含的))包含全表扫表

六: mysql 在使用不等于(!=或者<>)的时候无法使用的索引的导致的全表扫描

七:is null,is not null 也 无法使用索引

八:like 按照的通配符开头的() mysql 索引的失效会变成的全表扫表扫描

九:字符串的不加单引号,索引的失效

十:少用or ,用他连接的很多的情况下的会失效

十一:  少用的or ,用他的连接的很多的情况下的索引的会失效。

2.SQL 优化的实践.

sql  优化的最佳的实践:

1.选择最有效率的的表连额吉的顺序,

首先的要明白的一点就是LSQL的语法顺序,和执行顺序的是不一致的,

SQL的语法顺序:

select [distinct] ..from ..[xxx join]  [on]  .. where .. group by ..

having ...[union]

order by....

SQL 的执行顺序:

from  ... 【xxx join】 [on] .. where .. group by .. avg() ,sum ..having 。。

select  【disinct】... order by ...

from 子句--执行顺序为前后的前后的往前的,从右到左。

表名(最后面的那个表名为驱动表),执行的顺序的为后前,所以数据量的

较少的尽量放后。


where 子句的--执行的顺序为自下而上的,从右到左

将可以的过滤掉大量数据的条件写在where 的子句末尾性能最优。

group by 和order by 子句执行的顺序都为左到右

select 子句的--少用* 号,尽量的取字段的名称,使用的列明的意味着减少消耗时间。
 

2.避免产生的集合

含有的多表的sql 语句的,必须指明的表的连接条件,以避免的产生的

group by 和order by 子句执行的从左到右边

3.用where 子句的替换的having 的子句。

where 子句的搜索的条件的进行的分组操作的之前引用,

而having 自己的条件的在进行的分组的操作的之后的引用。

避免的使用的having 子句,having 子句的只会在检索的所有的记录之后才对的结果进行

过滤。这个处理需要的排序,总计等操作。

如果的能通过的where子句的限制记录的数目,那就能减少这方面的开销。


 

5.用exists,not exists 和 in ,not in 相互 替代

原则是哪个子查询的产生的结果集合小,就选哪个

select * from t1 where x   (select y from t2)

select * from t1 where exists (select null from t2 where y=x)

IN 适合于外表大而内表小的情况,而exists 使用与外表的小而内表的大的情况

6.使用的exists 替代distinect

当提交一个包含一对移动的信息(比如部门表和雇员表)的查询时,避免在select子句的使用的

distinct,一般可以考虑exists,exussts使用查询更为迅速,因为子查询的条件的一旦满足,立马返回结果。

低效写法:

select distinct dept_no,dept_name,

from  dept d,emp e 

where d.deptno_no=e.dept_no

高效写法:

select deot_no,dept_name 

from dept d

where  exists

  select  'X'  from e_mp  where  e.dept_no=d.dept_no

备注:

其中X的意思: 因为 exists 只是看子查询的是否有返回结果返回,而不返回的的什么内容。

因此的建议的写一个常量,性能较高!

用exists 的确可以替代distinct ,不过的以上方案仅仅使用的dept_no 为唯一的主键的情况。

如果要去掉重复记录。

需要参考一下的写法:

select * from emp where dept_no 

exists (

select max(dept_no) from  dept d, emp   e

where   e.dept_no=d.dept_no groupy by d.dept_no

)

7.避免隐士数据类型

因此

3.深入mysql锁的与事务隔离界别。


 

发布了449 篇原创文章 · 获赞 10 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/xiamaocheng/article/details/104007660