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锁的与事务隔离界别。