sql优化的中心思想:尽可能使用索引。而复杂的判断会影响索引的使用。
(1)选取最适合的字段类型
(2)尽可能将字段设置为NOT NULL,这样数据库查询时可以省去NULL值的比较。
(3)使用join来代替子查询。
(4)使用联合(UNION)来代替手动创建的临时表。
(5)sql优化:首先,最好是在相同类型的字段间进行比较的操作; 其次,在建有索引的字段上尽量不要使用函数进行操作;第三,在搜索字符型字段时,我们有时会使用LIKE关键字和通配符,这种做法虽然简单,但却也是以牺牲系统性能为代价的。
1:mysql go awary的错误:数据库一次性插入40万数据造成的。
数据库查询慢的原因
-
-
类别 子类 表达式或描述 原因 索引 未建索引 - 产生全表扫描 未利用索引 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 代替 IN select num from a where num in(select num from b) in会逐个判断,exist有一条就结束 exist 代替select count(*) 判断记录是否存在 count(*) 将累加计算,exist有就结束 between 代替 IN ID in(1,2,3) IN逐个判断,between是范围判断 left outer join 代替Not IN select ID from a where ID not in(select b.Mainid from b) NOT IN逐个判断,效率非常低 union all 代替union select ID from a union select id from b union 删除重复的行,可能会在磁盘进行排序而union all只是简单的将结果并在一起 常用SQL尽量用绑定变量方法 insert into A(ID) values(1) 直接写SQL每次都要编译,用绑定变量的方法只编译一次,下次就可以用了
-