近期部门有大牛分享了下数据库的相关知识,自己这里趁热也总结一下对应测试来说比较容易涉及到的性能优化方面的知识。
数据库的性能从宏观上可以分为:查询、插入;这里小结了下影响这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影响查询:
- 联表查询需要连接条件
- 少用select *
- 避免使用LIKE '%parm1%'
- 不要在建立的索引的数据列上进行下列操作:【这些操作都会使索引失效】
- 避免对索引字段进行计算操作
- 避免嵌套多级子查询;使用临时表
- 尽可能的合并成一个sql操作;减少sql操作
- 避免在WHERE子句中使用in,not in,or 或者having;可以使用 exist 和not exist代替 in和not in
- 不要以字符格式声明数字,要以数字格式声明字符值。
- 尽量少用带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句
- WHERE 后的条件顺序
- ORACLE 采用从右至左的顺序解析WHERE子句,那些可以过滤掉最大数量记录的条件写在WHERE子句的末
- Group BY 后面跟的分组条件越多越慢,切忌不要无谓的添加分组条件
- 在sql文中转换类型会非常的慢 尽量不要使用 to_char, to_date 等函数
- <,> 替换为 <=, >=
标签:name,小结,数据库,索引,ADD,TABLE,table,优化,ALTER From: https://blog.51cto.com/u_15918230/5954626