- in 和 not in 也要慎用,否则会导致全表扫描,用IN的SQL性能比较低, 对于连续的数值,用 between , 在业务密集的SQL中用 exists(子查询)代替in,如果存在一对多的关系就使用distance去重。
- where 左侧不要用函数会导致全表扫描,where右侧表的排列顺序,小表在前大表在后, 因为多条查询的where条件语句,第一条的查询对cpu的使用高,把简单的查询放在首位, 第二条SQL的CPU占用率明显比第一条低。数据库自动先进小表的链接,再进行大表的链接, 在表的顺序不对时会产生十分耗服务器资源的数据交叉.
- 应尽量避免在 where 子句中使用 or 来连接条件,会导致全表扫,用union 是代替or ,先扫描全表,在删除重复数据,再计算出来.用union all代替,计算出所有数据,不进行删除,因为数据库基本没有重复数据.
- (>2和 <2)(大于或小于操作符)用>=3代替,<=1代替 ,因为>先计算出等于2,在判断大于2的数,计算2次,直接>=是直接计算出等于的3的数.计算一次.
- 使用like查询, 简单的使用index会导致全文索引,耗空间. 使用索引 like ''%a'' 不使用索引用 like ''%a%'' 查询, like ''%a%''不会使用索引,导致全表扫描.
- sql书写格式一致: 数据库对每个SQL都会对其进行一次分析,并且占用共享内存,如果将SQL的字符串及格式写得完全相同,则数据库只会分析一次,
- Update 语句更新少量字段可以减少频繁调用引起的性能消耗,同时减少大量日志。
- char(100) 型,在字段建立时空间就固定了,插入NULL值,也占用 100个字符, varchar(100)型, 插入NULL值,不占用空间。
- Count()会导t会引起全表扫描,杜绝使用。
- 表数据量过大的时候可以纵向、横向分割表,减少表的尺寸
如果涉及到表联接的过程中有group by这样的语句,可以先通过group by做为子查询,统计出结果后,再与其它表进行关联查询。
16.limit常用于分页处理,时常会伴随order by从句使用,因此大多时候会使用Filesorts这样会造成大量的io问题
1.使用有索引的列或主键进行order by操作
2.记录上次返回的主键,在下次查询时使用主键过滤
即将:select film_id,description from sakila.film order by film_id limit 50,5;
即将:select film_id,description from sakila.film order by film_id limit 500,5;
Io量增大,扫描505行数据。Limit5000,5扫描的行数是5005行。
优化方式
改为:select film_id,description from sakila.film where file_id >55 and film_id<=60 order by film_id limit 1,5;
这种方式有一个限制,就是主键一定要顺序排序和连续的,如果主键出现空缺可能会导致最终页面上显示的列表不足5条,解决办法是附加一列indexId,保证这一列是自增的并增加索引就可以了。
说明:几个简单的基本的sql语句
17.查询:select * from table1 where 范围
18.增加:insert into table1(field1,field2) values(value1,value2)
19.删除:delete from table1 where 范围
20.更新:update table1 set field1=value1 where 范围
21.模糊查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
22.排序:select * from table1 order by field1,field2 [desc]
23.分组: select * from table1 group by filed
24.分组过滤: select * from table1 where filed >1 gorup by field having count(flied) >=2
25.总数:select count(field1) as totalcount from table1
26.求和:select sum(field1) as sumvalue from table1
27.平均:select avg(field1) as avgvalue from table1
28.最大:select max(field1) as maxvalue from table1
29.最小:select min(field1) as minvalue from table1
30.语句顺序
select 选择的列
from 表
where 查询的条件
group by 分组属性
having 分组过滤的条件
这个是按照分组属性进行分组,所有分组属性上值相同的记录被分为一组,作为结果中的一条记录,后面的having是对分组进行过滤的条件,必须和group by一起使用
order by 排序属性
是对结果集合进行排序,可以是升序asc,也可以是降序desc
limit 起始记录位置,取记录的条数
对记录进行选取,主要用来实现分页功能