数据库有哪些优化方式
(1)问题分析
考官主要是对数据库优化方面的考核,一般数据库优化分为性能和应用方面的,如你了解sql优化吗;百万数据怎么优化等
(2)核心答案讲解
1)根据服务层面:配置MySQL性能优化参数;
2)从系统层面增强MySQL的性能:优化数据表结构、字段类型、字段索引、分表,分库、读写分离等等。
3)从数据库层面增强性能:优化SQL语句,合理使用字段索引。
4)从代码层面增强性能:使用缓存和NoSQL数据库方式存储,如MongoDB/Memcached/Redis来缓解高并发下数据库查询的压力。
5)减少数据库操作次数,尽量使用数据库访问驱动的批处理方法。
6)不常使用的数据迁移备份,避免每次都在海量数据中去检索。
7)提升数据库服务器硬件配置,或者搭建数据库集群。
8)编程手段防止SQL注入:使用JDBC PreparedStatement按位插入或查询;正则表达式过滤(非法字符串过滤);
(3)问题扩展
Sql优化(4-5条即可):
1)应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
2)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
3)很多时候用 exists 代替 in 是一个好的选择
4)用Where子句替换HAVING 子句 因为HAVING 只会在检索出所有记录之后才对结果集进行过滤
5)select count(*) from table;这样不带任何条件的count会引起全表扫描,并且没有任何业务意义,是一定要杜绝的
索引
索引概念:对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果我们把一个表的内容认为是一本字典,那索引就相当于字典的目录
索引类型:
Oracle:
逻辑上:
● Single column 单行索引
● Concatenated 多行索引
● Unique 唯一索引
● NonUnique 非唯一索引
● Function-based函数索引
● Domain 域索引
物理上:
● Partitioned 分区索引
● NonPartitioned 非分区索引
● B-tree:
● Normal 正常型B树
● Rever Key 反转型B树
● Bitmap 位图索引
MySQL索引分为普通索引、唯一索引、主键索引、组合索引、全文索引
何时使用索引
1)主键,unique字段;
2)和其他表做连接的字段需要加索引;
3)在where里使用>,≥,=,<,≤,is null和between等字段;
4)使用不以通配符开始的like,where A like 'China%';
5)聚集函数MIN(),MAX()中的字段;
6)order by和group by字段;
索引何时失效
1)组合索引未使用最左前缀,例如组合索引(A,B),where B=b不会使用索引;
2)like未使用最左前缀,where A like '%China';
3)搜索一个索引而在另一个索引上做order by,where A=a order by B,只使用A上的索引,因为查询只使用一个索引 ;
4)or会使索引失效。如果查询字段相同,也可以使用索引。例如where A=a1 or A=a2(生效),where A=a or B=b(失效)
5)如果列类型是字符串,要使用引号。例如where A='China',否则索引失效(会进行类型转换);
6)在索引列上的操作,函数(upper()等)、or、!=(<>)、not in等;
(4)结合项目中使用
1)常用但不经常修改的字段建索引(譬如商品表的商品名称等字段),达到检索速度增快,用户体验度增高的目的
2)用mycat进行分库分表
垂直拆分是基于数据库中的"列"进行,某个表字段较多,可以新建一张扩展表,将不经常用或字段长度较大的字段拆分出去到扩展表中。例如用户表,在字段很多的情况下(例如一个大表有100多个字段),通过"大表拆小表",更便于开发与维护,也能避免跨页问题
水平分表
水平切分分为库内分表和分库分表,是根据表内数据内在的逻辑关系,将同一个表按不同的条件分散到多个数据库或多个表中,每个表中只包含一部分数据,从而使得单个表的数据量变小,达到分布式的效果(如订单表)