sql查询性能优化

1.部分UPDATE、SELECT 语句写得很复杂(经常嵌套多级子查询)——可以考虑适当拆成
几步,先生成一些临时数据表,再进行关联操作;
生成临时表create temporary table tmp_table()
生成的临时表将在你连接MySQL期间存在。当你断开时,
MySQL将自动删除表并释放所用的空间

1.1.避免频繁创建和删除临时表,以减少系统表资源的消耗                    

2.经常发现有不少后台程序的性能问题是因为缺少合适索引造成的
前期在开发阶段,数据量较少,影响不大,随着时间的推移数
据量越来越庞大,缺少索引对性能影响会越来越大;

    索引使数据库程序无须对整个表进行扫描,就可以在其中找到
    所需的数据。当进行数据检索时,系统先搜索索引,从中找到
    数据的指针,再直接通过指针从表中取数据
        建立索引create index 索引名 on 表名(字段1,字段2);

3.对where条件进行优化

    3.1 可以使用 exist 和not exist代替 in和not in,extist可以用到索引
NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历
exist与in用的场合区别
            子查询集合数据量庞大时用exist,相反情况用in



    3.2用where替代having,因为having是分组筛选,用having就一定要和group by连用
        不能group by的话,默认整个表个一组

    3.3应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描

    3.4应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
        select name from table where classify is null;
        可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: 
        select id from t where num=0 

    3.5应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描
    3.6不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

    3.7.应尽量避免在 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 
        union 与union all的区别,
            都是两个结果集合并
            union会表链接后去重,nuion all不会去重
            union会对字段进行排序,而union all直接返回结果
            所以使用union all比union快

4.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引 ??????

5.当索引列有大量数据重复时,SQL查询可能不会去利用索引;

6.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引;

7.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了;

8.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理

9.IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然,也是收效最明显的优化手段

10.除了 IO 瓶颈之外,SQL优化中需要考虑的就是 CPU 运算量的优化了。order by, group by,distinct … 都是消耗 CPU 的大户(这些操作基本上都是 CPU 处理内存中的数据比较运算)。

11.静态表速度更快,类似char是固定长度和varchar不是
静态表字段长度固定,自动填充,读写速度很快,便于缓存和修复,但比较占硬盘,
动态表是字段长度不固定,节省硬盘,但更复杂,容易产生碎片,速度慢,出问题后不容易重建。

12.我们在多个表进行分页数据查询的时候,我们最好是能够在一个表上先过滤好数据分好页,
然后再用分好页的结果集与另外的表 Join连接查询;

13.MySQL比较擅长单表简单查询,尽量少用复杂的多表join

14.MySQL中可以使用连接查询来代替子查询。连接查询不需要建立临时表,其速度比子查询要快。所以相比子查询尽量多使用join

15.拆分大的DELETE和INSERT语句

因为这两个操作是会锁表的,对于高访问量的站点来说,锁表时间内积累的访问数、数据库连接、
打开的文件数等等,可能不仅仅让WEB服务崩溃,还会让整台服务器马上挂了。

所以,一定要拆分,使用LIMIT条件休眠一段时间,批量处理。

http://www.cnblogs.com/lddbupt/p/5781831.html

猜你喜欢

转载自blog.csdn.net/zoeou/article/details/65481400