vlambda博客
学习文章列表

数据库优化都有哪些?

数据库实际上是一个用于存储数据的电子文件柜。同时,用户可以添加、删除、更改和检查数据。在企业应用中,数据库非常重要,因此程序员在面试时经常被问及数据库。当面试官问你对数据库优化了解多少时,你应该如何回答?


你对数据库优化了解多少?


  1.问题分析。


  考官主要对数据库优化进行评估。一般来说,数据库优化分为性能和应用程序。如果您了解sql优化;如何优化数百万数据等。


  二、核心答案讲解。


  1.根据服务水平配置MySQL性能优化参数;


  2.从系统层面提高mysql的性能.优化数据表结构.字段类型.字段索引.分表、分库.读写分离等。


  3.从数据库层面提高性能.优化SQL语句,合理使用字段索引。


  4.从代码层面提高性能。使用缓存和NoSQL数据库存储,如MongoDB/Memcached/redis,以缓解高并发数据库查询的压力。


  5.减少数据库操作次数,尽量采用数据库访问驱动的批处理方法。


  6.不常用的数据迁移备份,避免每次都在海量数据中检索。


  7.改进数据库服务器的硬件配置,或构建数据库集群。


  8.防止SQL注入编程手段。使用JDBCPreparedStatement按位插入或查询;正则表达式过滤(非法字符串过滤);


  3.扩大问题。


  1.Sql优化。


  1)尽量避免在where子句中使用!=或>操作符,否则将发动机放弃使用索引进行全表扫描;


  2)尽量避免在where子句中判断字段的null值,否则会导致发动机放弃使用索引,进行全表扫描。比如selectidfromtwherEnumisnull可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:


  selectidfromtwherenum=0;


  3)很多时候,用exists代替in是个不错的选择;


  4)用Where子句代替HAVING子句,因为HAVING只有在检索到所有记录后过滤结果集;


  5)selectcount(*)fromtable;这种无条件的count会导致全表扫描,没有任何业务意义,必须杜绝;


  2.索引。


  1)索引概念。对数据库表中的一列或多列值进行排序的结构可以使用索引快速访问数据库表中的特定信息。如果我们认为表的内容是字典,那么索引就相当于字典的目录。


  2)索引类型:


  Oracle:


  逻辑上:Singlecolumn单行索引。


  Concatenated多行索引。


  Unique唯一的索引。


  Nonunique不是唯一的索引。


  Function-based函数索引。


  Domain域索引。


  物理:物理:


  Partitioned分区索引。


  非分区索引。


  B-treee:


  Normal正常B树。


  反转型B树的Reverkey。


  Bitmap位图索引。


  MySQL索引分为普通索引.唯一索引.主键索引.组合索引.全文索引。


  3)何时使用索引。


  ①主键,unique字段;


  ②与其他表连接的字段需要添加索引;


  ③在where中使用>、≥、=、≤、isnull和between。


  等字段;等字段;


  ④使用不以通配符开始的like,wherealikeChina%;


  ⑤MIN(),MAX()中的字段;


  ⑥orderby和groupby字段;


  4)索引何时失效。


  ①组合索引未使用最左前缀,如组合索引(A、B),whereB=B不使用索引;


  ②Like不使用最左前缀,wherealike‘%China’;


  ③搜索一个索引,在另一个索引上做orderby,wherea=aorderbyB,只使用a上的索引,因为查询只使用一个索引;


  ④或者会使索引失效。如果查询字段相同,也可以使用索引。比如wherea=a1ora=a2(生效),wherea=aorb=b(失效)


  ⑤如果列的类型是字符串,请使用引号。比如wherea=China,否则索引无效(类型转换);


  ⑥索引列上的操作,函数(upper()等).or.=(>).notin等;


  四、结合项目使用。


  1.常用但不经常修改的字段构建索引(如商品表中的商品名称和其他字段),以提高检索速度和用户体验。


  2.用mycat分库。


  垂直拆分是基于数据库中的“列”。有许多表字段。您可以创建一个新的扩展表,并将不常用或字段长度较大的字段拆分到扩展表中。例如,在用户表中,在字段较多的情况下(例如,大表有100多个字段),通过“大表拆卸小表”,更容易开发和维护,也可以避免跨页问题。


  水平分表。


  水平分为库分表和库分表,根据表数据的内部逻辑关系,根据不同的条件将同一表分散到多个数据库或多个表,每个表只包含部分数据,使单个表的数据量减少,达到分布式效果(如订单表)