???? 那么有一个参数join_buffer_size的设置不要太吝啬。
???? windows--->my.ini??? linux--->my.cnf文件中
???? 建议join_buffer_size为1MB,如果内存充足的话可以设置为2MB.
???? 每个线程(可以认为是每个连接)多会创建自己的buffer,是独占而不是共享。
?
?
???????2.1 尽可能在索引列上完成排序操作
2.2 如果不在索引列上,mysql就要启动排序算法(执行计划中可以看到? extra--->filesort)
??????? mysql为了兼容老的版本,有两种进行排序的算法,可以简单的认为(老的排序算法,新的排序算法),新的排序算法,性能更好些,如何使用新的排序算法呢。
2.3 max_length_for_sort_data参数的设置(这个设置直接决定了是用的老的算法还是新的算法)
????? 当我们所有返回字段的最大长度小于这个参数值的时候,mysql会选择新的排序算法,否则使用老的排序算法。
2.4 只返回自己需要的列
2.5 增大sort_buffer_size参数的设置,不是为了进行选择排序算法而设置,减少排序过程中对数据进行分段,就会导致mysql启动临时表存放数据,进行交换排序,大小最好能够容纳需要排序的数据量,也是独占
???? 内存的,不是共享的.
?
?
?3.1 group by 原理其实是先进行排序,然后进行分组,要用到排序尽可能在索引列上完成分组
?3.2 当无法使用索引列,那么max_length_for_sort_data参数的设置.sort_buffer_size参数的设置
?3.3 能在where限定的条件就不要去having限定了,有些条件是既可以放在having又可以放在where的时候应该放在where.
?
?
?4.1 原理先进行GROUP BY 然后在每组中取出一条记录,在DISINCT关键字中进行分组的不一定先进行排序,如果使用了聚合函数的情况下是要排序的,否则不进行排序工作,大家可以通过查看执行计划.
?4.2 很多的优化就和group by类似了。
?
1.1范式的问题
???? 最终的目的是避免数据的冗余,保持数据的一致性(修改数据简单)
???? 那个年代存储代价相当昂贵,并发量,数据量没有达到现在互联网的大数据场景
1.2适当冗余数据 让Query尽量减少join(高并发,大数据量的场景下)
???? 例如:高并发的论坛-并发最高的是查看帖子标题和作者昵称,原始的就应该用join。帖子表中冗余存放作者的昵称.查询的时候就避免了join的出现。
????? 修改的时候必须修改两种表(这种修改是极少的也不会出现高并发)
1.3 范式和非范式结合使用
2.1 一个字段很大,大于其它字段的总和甚至好几倍,但是这个字段又不是频繁使用的字段
2.2 如帖子表
????? 帖子内容是相当大的一个字段我们可以把该字段单独一张表存放,和帖子表一对一关联大大降低访问的IO
????? 如果访问频率很高就应该选择其它NOSQL类的数据源如文档数据库--->Mongodb
2.3 常用字段和不常用字段也做垂直拆分
???? ?用户表(常用字段无非就是用户名、密码、昵称、邮箱等,其它像生日、QQ、MSN,地址电话可能很少使用)高并发,有常用字段和极少使用字段,
????? 那么垂直拆分,把常用字段做为一张表大大降低IO,不常用字段单独一张表一对一关联.
?
把一张表拆成多张表--->按记录去拆分目的就是一张一张小表呈现,只要少量的数据,要有划分标准。?
?
尽可能占用空间少--->IO,并且计算速度快的类型--->CPU。对mysql数据库的所有类型要详细的了解
?
结构化数据
二进制多媒体数据 、图片等---->选用其它数据库NOSQL
实时性高的数据----->内存数据库
?
?
原文:http://394498036.iteye.com/blog/2290827