miracle just wanna be better

sql优化

2019-11-04
miracle

  1. count的优化 比如:计算id大于5的城市 a. select count() from world.city where id > 5; b. select (select count() from world.city) – count() from world.city where id <= 5; a语句当行数超过11行的时候需要扫描的行数比b语句要多,b语句扫描了6行,此种情况下,b语句比a语句更有效率。 当没有where语句的时候直接select count() from world.city这样会更快,因为mysql总是知道表的行数。
  2. 索引字段上进行运算会使索引失效。 尽量避免在WHERE子句中对字段进行函数或表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如: SELECT * FROM T1 WHERE F1/2=100 应改为: SELECT * FROM T1 WHERE F1=100*2。
  3. 尽量使用数字型字段. 一部分开发人员和数据库管理人员喜欢把包含数值信息的字段 设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。 比如设计学生信息表中的性别问题,使用 男、女的性能就不如使用数字1、2来代替。
  4. 合理使用EXISTS,NOT EXISTS子句。如下所示:、 1.SELECT SUM(T1.C1) FROM T1 WHERE (SELECT COUNT()FROM T2 WHERE T2.C2=T1.C2>0) 2.SELECT SUM(T1.C1) FROM T1WHERE EXISTS(SELECT * FROM T2 WHERE T2.C2=T1.C2) 两者产生相同的结果,但是后者的效率显然要高于前者。因为后者不会产生大量锁定的表扫描或是索引扫描。如果你想校验表里是否存在某条纪录,不要用count()那样效率很低,而且浪费服务器资源。可以用EXISTS代替。如: IF (SELECT COUNT(*) FROM table_name WHERE column_name = ‘xxx’)可以写成: IF EXISTS (SELECT * FROM table_name WHERE column_name = ‘xxx’)
  5. 关键字的使用: 能够用DISTINCT的就不用GROUP BY, 尽量不要用SELECT INTO语句。SELECT INTO 语句会导致表锁定,阻止其他用户访问该表。
  6. 能用UNION ALL就不要用UNION UNION ALL不执行SELECT DISTINCT函数,这样就会减少很多不必要的资源 在跨多个不同的数据库时使用UNION是一个有趣的优化方法,UNION从两个互不关联的表中返回数据,这就意味着不会出现重复的行,同时也必须对数据进行排序,我们知道排序是非常耗费资源的,特别是对大表的排序。 UNION ALL可以大大加快速度,如果你已经知道你的数据不会包括重复行,或者你不在乎是否会出现重复的行,在这两种情况下使用UNION ALL更适合。此外,还可以在应用程序逻辑中采用某些方法避免出现重复的行,这样UNION ALL和UNION返回的结果都是一样的,但UNION ALL不会进行排序。
  7. 程序中如果一次性对同一个表插入多条数据,比如以下语句: insert into person(name,age) values(‘xboy’, 14); insert into person(name,age) values(‘xgirl’, 15); insert into person(name,age) values(‘nia’, 19); 把它拼成一条语句执行效率会更高. insert into person(name,age) values(‘xboy’, 14), (‘xgirl’, 15),(‘nia’, 19);
    例如:常见经典面试题及答案中第三题。
  8. 尽量避免使用in: 很多时候用 exists 代替 in 是一个好的选择: select num from a where num in(select num from b) 用下面的语句替换: select num from a where exists(select 1 from b where num=a.num)
  9. 尽量避免使用or 应尽量避免在 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
  10. 查询字段个数大于1的字段及个数

    SELECT title,COUNT(title) FROM test GROUP BY title HAVING COUNT(title)>1


Similar Posts

上一篇 冒泡排序

下一篇 List集合

Comments