• 数据库优化都有哪些?


    一、问题分析

      

      考官主要是对数据库优化方面的考核,一般数据库优化分为性能和应用方面的,如你了解 sql 优化吗;百万数据怎么优化等

      

      二、 核心答案讲解

      

      1、根据服务层面 、配置 mysql 性能优化参数;

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

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

      4、从代码层面增强性能 、使用缓存和 NoSQL 数据库方式存储,如 MongoDB/Memcached/Redis 来缓解高并发下数据库查询的压力。

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

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

      7、提升数据库服务器硬件配置,或者搭建数据库集群。

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

      

      三、问题扩展

     

      1、Sql 优化

      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 会引起全表扫描,并且没有任何业务意义,是一定要杜绝的;

      

      2、索引

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

      

      2)索引类型 :

      Oracle:

      逻辑上 :Single column 单行索引

      Concatenated 多行索引

      Unique 唯一索引

      NonUnique 非唯一索引

      Function-based 函数索引

      Domain 域索引

      物理上:

      Partitioned 分区索引

      NonPartitioned 非分区索引

      B-tree :

      Normal 正常型 B 树

      Rever Key 反转型 B 树

      Bitmap 位图索引

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

      

      3)何时使用索引

      ①主键,unique 字段;

      ②和其他表做连接的字段需要加索引;

      ③在 where 里使用>,≥,=,<,≤,is null 和 between

      等字段;

      ④使用不以通配符开始的 like,where A like 'China%';

      ⑤聚集函数 MIN(),MAX()中的字段;

      ⑥order by 和 group by 字段;

      4)索引何时失效

      ①组合索引未使用最左前缀,例如组合索引(A,B),where B=b 不会使用索引;

      ②like 未使用最左前缀,where A like '%China';

      ③搜索一个索引而在另一个索引上做 order by,whereA=a order by B,只使用 A 上的索引,因为查询只使用一个索引 ;

      ④or 会使索引失效。如果查询字段相同,也可以使用索引。例如 where A=a1 or A=a2(生效),where A=a orB=b(失效)

      ⑤如果列类型是字符串,要使用引号。例如 whereA='China',否则索引失效(会进行类型转换);

      ⑥在索引列上的操作,函数(upper()等)、or、!=(<>)、not in 等;

      

    作者: 王春天
    出处: http://www.cnblogs.com/spring_wang/
    Email: spring_best@yeah.net
    QQ交流:903639067 

      四、结合项目中使用

      

      1.常用但不经常修改的字段建索引(譬如商品表的商品名称等字段),达到检索速度增快,用户体验度增高的目的

      2.用 mycat 进行分库分表

      垂直拆分是基于数据库中的"列"进行,某个表字段较多,可以新建一张扩展表,将不经常用或字段长度较大的字段拆分出去到扩展表中。例如用户表,在字段很多的情况下(例如一个大表有 100 多个字段),通过"大表拆小表",更便于开发与维护,也能避免跨页问题

      水平分表

      水平切分分为库内分表和分库分表,是根据表内数据内在的逻辑关系,将同一个表按不同的条件分散到多个数据库或多个表中,每个表中只包含一部分数据,从而使得单个表的数据量变小,达到分布式的效果(如订单表)

  • 相关阅读:
    【转载】[教程]OpenSEES超简单易懂的入门第一课
    【转载】面向对象的非线性有限元方法
    与李文雄老师讨论有限元
    【转载】 Moving Beyond OpenGL 1.1 for Windows
    【转载】国外免费期刊全文数据库
    与李文雄老师讨论学术研究
    【转载】VS 2010和.NET 4.0之WPF 4改进全解析
    【转载】MFC中SDI、MDI框架各部分指针获取(网上找的,好东西大家一起分享,多谢原创作者!)
    【转载】一位院士——搞科研的几个条件
    Visual Studio 2010 step by step学习摘要
  • 原文地址:https://www.cnblogs.com/spring_wang/p/14548519.html
Copyright © 2020-2023  润新知