sql优化

  1. in 和 not in 也要慎用,否则会导致全表扫描,用IN的SQL性能比较低, 对于连续的数值,用 between , 在业务密集的SQL中用 exists(子查询)代替in,如果存在一对多的关系就使用distance去重。
  2. where 左侧不要用函数会导致全表扫描,where右侧表的排列顺序,小表在前大表在后, 因为多条查询的where条件语句,第一条的查询对cpu的使用高,把简单的查询放在首位, 第二条SQL的CPU占用率明显比第一条低。数据库自动先进小表的链接,再进行大表的链接, 在表的顺序不对时会产生十分耗服务器资源的数据交叉.
  3. 应尽量避免在 where 子句中使用 or 来连接条件,会导致全表扫,用union 是代替or ,先扫描全表,在删除重复数据,再计算出来.用union all代替,计算出所有数据,不进行删除,因为数据库基本没有重复数据.
  4. (>2和 <2)(大于或小于操作符)用>=3代替,<=1代替 ,因为>先计算出等于2,在判断大于2的数,计算2次,直接>=是直接计算出等于的3的数.计算一次.
  5. 使用like查询, 简单的使用index会导致全文索引,耗空间. 使用索引 like ''%a'' 不使用索引用 like ''%a%'' 查询, like ''%a%''不会使用索引,导致全表扫描.
  6. sql书写格式一致: 数据库对每个SQL都会对其进行一次分析,并且占用共享内存,如果将SQL的字符串及格式写得完全相同,则数据库只会分析一次,
  7. Update 语句更新少量字段可以减少频繁调用引起的性能消耗,同时减少大量日志。
  8. char(100) 型,在字段建立时空间就固定了,插入NULL值,也占用 100个字符, varchar(100)型, 插入NULL值,不占用空间。
  9. Count()会导t会引起全表扫描,杜绝使用
  10. 表数据量过大的时候可以纵向、横向分割表,减少表的尺寸
    如果涉及到表联接的过程中有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 起始记录位置,取记录的条数
对记录进行选取,主要用来实现分页功能

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容