1、尽量取出自己想要的字段,不要这样select * from table
因为你取的越多,网络传输的数据就越多,从网络带宽和网络缓冲区上来看都是浪费。
特别是在order,性能更是下降。,实现方式是先将需要排序的字段和可以直接定位到相关行数据的指针信息取
出,然后在我们所设定的排序区(通过参数sort_buffer_size 设定)中进行排序,完成排序之后再次
通过行指针信息取出所需要的Columns,也就是说这种算法需要访问两次数据。第二种排序算法是从
MySQL4.1 版本开始使用的改进算法,一次性将所需要的Columns 全部取出,在排序区中进行排序后直
接将数据返回给请求客户端。改行算法只需要访问一次数据,减少了大量的随机IO,极大的提高了带有
排序的Query 语句的效率。但是,这种改进后的排序算法需要一次性取出并缓存的数据比第一种算法
要多很多,如果我们将并不需要的Columns 也取出来,就会极大的浪费排序过程所需要的内存。在
MySQL4.1 之后的版本中,我们可以通过设置max_length_for_sort_data 参数大小来控制MySQL 选择
第一种排序算法还是第二种排序算法。当所取出的Columns 的单条记录总大小max_length_for_sort_data 设置的大
小的时候,MySQL 就会选择使用第一种排序算法,反之,则会选择第二种优化后的算法。为了尽可能提高排序性能,
我们自然是更希望使用第二种排序算法,所以在Query 中仅仅取出我们所需要的Columns 是非常有必要的。
2、适当建立索引,来提高查询速度
我想每个人都知道索引能够提高查询速度,但是创建索引时有原则。
前提:一般对不经常变化的字段、最好不是常量字段、能够过滤大部分数据的字段进行索引,因为如果这个字段经常
变化,当数据量很大的时候,每次更新这个字段索引都是需要重新建立的,会耗很大性能和时间的,如果这个字段是个
常量值,要有七八个值,那么这样索引区中重复索引会很多,极大地浪费空间,数据量会很大,查询的性能也不会提高。
在以下情况下索引不会起到作用:
like语句、!=、<>、函数索引、join的时候字段不一致。
3、图片,大文件、日志、流水信息不应该存储在数据库里
4、在排序和分组的时候尽量使用索引字段
因为查询的时候,如果按照索引进行排序的话,查询的时候返回的数据数据已经是排序好的数据了,
在分组的时候 是先进行排序在进行分组的。
5、小的结果集驱动大的结果集
在进行join的时候,永远都是要小的结果集来驱动大的结果集,因为mysql是通过嵌套循环来实现join的,也就是第一查询出来的结果越多,那么第二次查询的循环次数也就越多,进行磁盘io操作也就多。
6、采用MYsql MYISAM存储引擎的时候,由于采用的是表级锁定,那么争用资源对象的几率就大了,那么对并发影响很大,那么这个时候,
我们应该尽量减少sql执行的时候,拆分复杂的sql,变成简单的sql,进而缩短执行sql的时间,加快响应的时间,这样并发亮相应的也就提高了
但是有在很难拆分的情况,我可以通过增大join_buffer_size来提高join的性能。
7、在join的时候尽量使用索引字段
8、不要是自己的产品过渡理想化
如实时性,实时更新某个表的字段,在高并发的时候这样读写对数据库且是同一张表,可想而知后果,可以改为日终的时候再去处理日志或者数据库相关数据进行分析。
9、运用explain、profile分析sql