数据库性能优化小结

近期部门有大牛分享了下数据库的相关知识,自己这里趁热也总结一下对应测试来说比较容易涉及到的性能优化方面的知识。

数据库的性能从宏观上可以分为:查询、插入;这里小结了下影响这2个方面性能的因素。


索引影响查询:
不加索引 ==> 全表扫描;查询效率最低

主键/唯一索引==主键索引扫描

ALTER TABLE `table_name` ADD PRIMARY KEY (`ID`);
ALTER TABLE `table_name` ADD KEY (`column`); 
ALTER TABLE `table_name` ADD UNIQUE (`column`); 
ALTER TABLE `table_name` ADD FULLTEXT (`column`);

普通索引
ALTER TABLE `table_name` ADD INDEX index_name (`column`);
ALTER TABLE `table_name` ADD INDEX index_name (`column1`, `column2`, `column3`);

普通压缩索引
ALTER TABLE `table_name` ADD INDEX index_name (`column`) compress;

位图索引(mysql不支持、oracle支持)
ALTER TABLE `table_name` ADD bitmap INDEX index_name (`column`);

位图索引+并行扫描;查询速度最快
ALTER TABLE `table_name` ADD bitmap INDEX index_name (`column`) parallel 8;

字段类型+查询方式
索引建议针对数字类型;如果为字符等其它类型,在查询的时候尽量使用闭区间,如:between;不用开区间,如:>=

索引影响插入:
全局索引
create index i_id on test(id) global;
分区索引
create index i_id on test(id) local;
如果要经常性或大批量的插入操作,减少全局索引的设置。

sql影响查询:

  1. 联表查询需要连接条件
  2. 少用select *
  3. 避免使用LIKE '%parm1%'
  4. 不要在建立的索引的数据列上进行下列操作:【这些操作都会使索引失效】
  5.       避免对索引字段进行计算操作
  6.       避免在索引字段上使用not,<>,!=
  7.       避免在索引列上使用IS NULL和IS NOT NULL
  8.       避免在索引列上出现数据类型转换
  9.       避免在索引字段上使用函数
  10.       避免建立索引的列中使用空值
  11.       避免嵌套多级子查询;使用临时表
  12. 尽可能的合并成一个sql操作;减少sql操作
  13. 避免在WHERE子句中使用in,not  in,or 或者having;可以使用 exist 和not exist代替 in和not in
  14. 不要以字符格式声明数字,要以数字格式声明字符值。
  15. 尽量少用带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句
  16. WHERE 后的条件顺序
  17.      mysql 采用从左至右的顺序解析WHERE子句,那些可以过滤掉最大数量记录的条件写在WHERE子句的前面
  18.      ORACLE 采用从右至左的顺序解析WHERE子句,那些可以过滤掉最大数量记录的条件写在WHERE子句的末
  19. Group BY 后面跟的分组条件越多越慢,切忌不要无谓的添加分组条件
  20. 在sql文中转换类型会非常的慢 尽量不要使用 to_char, to_date 等函数
  21. <,> 替换为 <=, >=
sql性能分析工具:
sql执行计划:
mysql:http://www.cnblogs.com/ggjucheng/archive/2012/11/11/2765237.html
oracle数据库自身性能数据表:
http://www.cnblogs.com/advocate/archive/2010/05/07/1729830.html
sql慢日志记录

你可能感兴趣的:(sql,索引)