还剩3页未读,继续阅读
文本内容:
4.SQL4,数据库本身方面的11调节数据库的参数配置,CPU最大并行度、并行性开销阀值、数据库文件布局2增大临时表空间3数据库实体的碎片的整理特别是对某些表经常进行insert和delete动作,尤其注意,索引字段为系列字段、自增长字段、时间字段,对于业务比较频繁的系统,最好一个月重建一次4对访问频繁的数据,充分利用数据库cache5日志库优化当有insert和update,delete操作时,会在日志库中记录日志,随着时间的积累,日志库记录越来越多,每插入一条日志都非常耗时,直接影响我们系统的数据操作解决办法设定每天晚上自动备份,在数据库备份之后,数据库会自动收缩日志库,删除一些日志数据,这样日志库的数据量就下来了因为数据库觉得你已经备份过了,万一出什么问题,可以用备份文件来恢复,也不需要依靠日志库来进行还原了,没必要再保存那么多日志了.模型设计21主键外键的设计2字段类型优先级Bitint,intdate,timechar,varchartext,原因整型,time运算快,节省空间所以我们在表设计时,如果是bool类型的数据值就不应该用int类型字段3数据类型尽量用数字型,数字型的比较比字符型的快很多4数据长度尽量小,这里的尽量小是指在满足可以预见的未来需求的前提下的5尽量不要允许NULL,除非必要,可以用NOT NULL+DEFAULT代替6少用TEXT和IMAGE,二进制字段的读写是比较慢的,而且,读取的方法也不多,大部分情况下最好不用7自增字段要慎用,不利于数据迁移8建立索引较频繁地作为查询条件的字段,唯一性不太差的字段适合建立索引,更新不太频繁地字段适合创建索引,不会出现在where条件中的字段不该建立索引9聚集索引字段类型的选择主键的索引结构中,即存储了主键值,又存储了行数据,这种结构称为“聚集索引”,在插入数据时,数据节点会分裂,这个问题比较严重,节点下存储了“行数据”,分裂的时候,还要移动行数据如果主键是无规律的,则会加速它的数据节点分裂,且效率极低高性能索引策略主键,尽量用整型,而且是递增的整型如果是无规律的数据,将会产生页的分裂,影响速度索引长度直接影响索引文件大小,影响增删改的速度,并间接影响查询速度占用内存多因为主键索引在物理存放时是有序的,如果主键的值是无序的,那么主键每次插入时,索引文件都重新进行排序,会产生额外的数据消耗,另外主键的叶子上存放的数据,还会导致叶子数据行的移动和分裂,又会产生一些消耗,所以主键尽量用整型,且自增的类型10纵向拆分把不需要用于查询的大字段,放到另外一个新建的附属表中,这样就将表的数据内容减少到最少,存储块中可以多存储许多数据行,减少程序读取存储块的个数11横向拆分表分区,表分区的条件,一张数据表的行数至少要达3000W行以上的数据,就可以考虑做表分区了但这不是绝对,如果表的数据行内容特别多,查询特别慢时,也可以尽早做表分区注意问题普通表在查询时,会比分区表要快一些,因为基于分区表的查询会遍历所有的分区表,而普通表只查询了普通表一个表解决办法,在查询条件中加入分区条件,这样查询就会落入指定的分区中,不用遍历所有的分区,但问题是,是不是所有的查询都能加入分区条件呢只要进行了表分区,那么SQL的前提条件就是所有SQL都要加上分区条件,除非个别的汇总,统计类的SQL12据库分库当一个台数据库表服务器访问压力过大,数据量过大时,就需要考虑进行数据库分库,数据库分库条件和表分区的逻辑是比较像的根据业务条件,如地区,时间,进行拆分.应用程序31减少应用和数据库的交互次数、同一个sql语句的执行次数,批量SQL尽量一次性提交2一次链接多次使用3使用完毕后关闭数据库链接4生产库与查询库分离,相关的表常驻内存规范方面
4.SQL1写明具体列写明查询具体某几列,减少.的使用,表名过长时,尽量使用表的别名一和列名一样2EXISTS替代IN在业务密集的SQL当中尽量不采用IN操作符,用EXISTS方案代替3in和exists的区别如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists其实我们区分in和exists主要是造o成了驱动顺序的改变这是性能变化的关键,如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了,另外IN时不对NULL进行处理in是把外表和内表作hash连接,而exists是对外表作loop循环,每次oop循环再对内表进行查询一直以来认为exists比1in效率高的说法是不准确的4模糊查询like,尽量少用%关键词%yue%,由于yue前面用到了“%”,因此该查询必然走全表扫描,除非必要,否则不要在关键词前加%,5尽量使用Where先过滤数据二者都能使用尽量使用where与having比较where先过滤数据就少了再分组6Join替代子查询尽量使用多表连接join查询避免子查询子查询效率特别低,而一般的子查询都可以由关连查询来实现相同的功能,关联查询的效率要提高很多,所以建议在数据查询时避免使用子查询尤其是在记7使用内部函数多使用内部函数提高SQL效率例如多用concat连接,代替||的符号连接8应尽量避免在where子句中使用!=或<〉,in或not in9最好不要给数据库留NULL,尽可能的使用NOT NULL填充数据库不然会进行全表扫描,影响效率。