数据库sql优化详解
- 一,数据库sql优化—索引(优化的第一层)
1,假如数据库数据有几千上万条,那么查询时的效率一定会有所影响,首先呢,你可以用explain来检验效率: 例如:
1)普通查询 select * from user 查询user表可以写成 explain select * from user
假设如图所示:这就是查出来的数据,那么rows就是查出来的条数,很显然,当只查出几条就很可能卡死,所以这时就需要数据库优化,那么就引出优化的其中一种方式:索引
-
首先索引的位置在:数据库点击表—>右键设计表—>即可找到索引
-
索引主要有几个关键词:1)Unique代表唯一索引,也就是说这个字段的唯一性,索引一般分两种方式,BTREE和HASH,一般用BTREE即可
-
添加索引之后用同样的方法查询,得出查询数据的如图所示:(可自己对比,1图无索引,2图加索引),得出加索引之后,查询数据的数量有10万多减少到1条,同样速度也大幅度提升。(从个人理解上来说,索引可以看做是对比查询,当没有使用索引时,索要的数据就会和所有的数据一 一对比,而加上索引后,就相当于一个词典目录,从a—z依次查询)
(1) (2)
-
当然创建索引时,不要所有的字段都创建索引,经常查询或者经常当where条件的,可创建索引来提高效率
-
而且索引只有在查询时快,而进行insert、update、delete时慢,因为索引会占磁盘空间
-
索引会在使用like模糊查询时会失效
-
二,数据库sql优化—分页(优化的第二层)
-
在某种程度上来说分页也是一种优化的好方法,因为索引在优化数据库上有很好的效果,但是在实际工作中,比如做个列表(表格),我们并不会让所有的数据都显示出来,因此,就用到了分页(limit ):这样也可以加快查询速度
-
***三,数据库sql优化- - -(sql本身的优化)***( 仅供参考)
-
数据库本身的优化有很多种:如:
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20
5.in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
6.下面的查询也将导致全表扫描:
select id from t where name like ‘%abc%’
7.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where num/2=100
应改为:
select id from t where num=100*2
8.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)=‘abc’–name以abc开头的id
应改为:
select id from t where name like ‘abc%’
9.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
10.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,
否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
-
-
四,数据库sql优化- - -(大表拆小表)
把大的表拆分成小的表进行运行
- 五,数据库sql优化- - -(加冗余字段)
例如:两张表,在一个封装类中把另一个表多次调用的字段进行封装到一个表中,减少了调用的次数,也可以提高sql的运行效率。 - 六,数据库sql优化- - -(读写分离)
也就是说sql的主从配置