数据库优化

sql优化的中心思想:尽可能使用索引。而复杂的判断会影响索引的使用。

(1)选取最适合的字段类型
(2)尽可能将字段设置为NOT NULL,这样数据库查询时可以省去NULL值的比较。
(3)使用join来代替子查询。
(4)使用联合(UNION)来代替手动创建的临时表。
(5)sql优化:首先,最好是在相同类型的字段间进行比较的操作; 其次,在建有索引的字段上尽量不要使用函数进行操作;第三,在搜索字符型字段时,我们有时会使用LIKE关键字和通配符,这种做法虽然简单,但却也是以牺牲系统性能为代价的。

1:mysql go awary的错误:数据库一次性插入40万数据造成的。

数据库查询慢的原因

    1. 类别子类表达式或描述原因
      索引未建索引-产生全表扫描
      未利用索引substring(card_no,1,4)=′5378′产生全表扫描
      amount/30< 1000产生全表扫描
      convert(char(10),date,112)=′19991201′产生全表扫描
      where salary<>3000产生全表扫描
      name like ‘%张’产生全表扫描
      first_name + last_name ='beill cliton'产生全表扫描
      id_no in(′0′,′1′)产生全表扫描
      select id from t where num=@num有参数也会产生全表扫描
      使用效能低的索引oder by 非聚族索引索引性能低
      username=‘张三’and age>20字符串索引低于整形索引
      表中列与空NULL值索引性能低
      尽量不要使用IS NULL或IS NOT NULL索引性能低
      数据量所有数据量select *很多列产生大量数据
      select id,name表中有几百万行,产生大量数据
      嵌套查询先不过滤数据,后过滤数据产生大量无用的数据
      关联查询多表进行关联查询,先过滤掉小部分数据,在过滤大部分数据大量关联操作
      大数据量插入一次次插入产生大量日志,消耗资源
      锁等待update account set banlance=100 where id=10产生表级锁,将会锁住整个表
      死锁A:update a;update b;B:update b;update a;将会产生死锁
      游标Cursor Open cursor,fetch;close cursor性能很低
      临时表create tmp table 创建临时表产生大量日志
      drop table删除临时表需要显示删除,避免系统表长时间锁定
      其他exist 代替 INselect num from a where num in(select num from b)in会逐个判断,exist有一条就结束
      exist 代替select count(*)判断记录是否存在count(*) 将累加计算,exist有就结束
      between 代替 INID in(1,2,3)IN逐个判断,between是范围判断
      left outer join 代替Not INselect ID from a where ID not in(select b.Mainid from b)NOT IN逐个判断,效率非常低
      union all 代替unionselect ID from a union select id from b union删除重复的行,可能会在磁盘进行排序而union all只是简单的将结果并在一起
      常用SQL尽量用绑定变量方法insert into A(ID) values(1)直接写SQL每次都要编译,用绑定变量的方法只编译一次,下次就可以用了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值