这几天一直在看书,没办法啦,谁让自己是个小菜鸡,连菜鸡互啄都找不到队友。还没从被辞退中缓过神来,越看书越看经验丰富前辈写的文章,越觉得自己所学所知实在是太少太肤浅,现在连简历都不敢投了?只好躲在房间里,写写自己的看书感悟。
上午看了一篇文章关于怎么实现MySQL性能优化,让我很有感触,也理解上一次面试官说:你对MySQL性能优化就是提留在建立索引和条件筛选这个层面,我建议你多看看书,再来面试。不说废话了,看看人家是怎么分析MySQL优化吧,原文链接将会在文末给出。
抛开数据量和并发量来谈性能都是刷流氓,《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表(对于分库分表还没有深入了解,如果有机会会在后文给出,如果有后文的话)。回想起之前公司的数据库,单表数据已经是上亿了,容量超过5GB,某些常用的单表数据也有千万,查询速度远远高于0.5秒,给出的解决方法是查询时间超过5秒,停止本次查询,要求用户再次查询。现在看来这个办法是有些不太聪明,自己当初也没有深入去了解一下,颇有遗憾。
接着再说并发量,是指同一时刻数据库能处理多少个请求,是由max_connections和max_user_connections决定的。max_connections是指MySQL实例最大的连接数,上限是16384;max_user_connections是指数据库同时允许多少用户连接,由于MySQL为每一个用户连接都提供缓冲区,消耗内存。越多的连接实例,越多的用户连接同一个数据库,那么效率也会越低。合理的设置是:用户连接数与实例比值不超过10%,即假设有50个用户连接同一个数据库,连接实例不得超过5000。
查看实例最大连接数与用户连接数:
show variables like '%max_connections%';
show variables like '%max_user_connections%';修改配置文件my.cnf
[mysqld]
max_connections = *
max_used_connections = *下面开始说数据表的设计怎样提高查询效率
数据类型:选择更简单或者占用空间更小的数据类型。
如果是标志符等用于判读true false,就应该尽量使用tinyint、smallint、medium_int 而不是是采用int,在之前公司,判读有效标志,删除标志采用int,现在看来有大量的空间被浪费了;
字符长度确定,就应该采用char类型,减少使用varchar;
如果varcharle类型满足需求,就尽量减少text类型;时间采用timestamp 而不是Long 或者是datetime;
精度要求高使用decimal类型,也可以使用bigint,在存入时候乘以10000保存;text类型优化:
通常text类型存储大量的数据,非常容易造成表容量暴涨,影响其他字段的查询性能,最好的解决办法是使用业务主键关联存放该字段的子表,这样在查询过程中不会因为多出一张表而新增一些比较难的处理逻辑。
避免空值:MySQL中null依旧是占用空间,会使得索引、索引统计变得更加复杂。
尽可能用有效字符代替null值,即可以避免 is not null的判断,也可以实现原地更新,规避索引分裂影响性能的风险。索引优化:建立索引本身就是一种优化手段,但是合理使用索引才是更重要的
分页查询很重要,如果查询数据量超过30%,MYSQL不会使用索引;
单表索引数不超过5个、单个索引字段数不超过5个;
字符串可使用前缀索引,前缀长度控制在5-8个字符;
字段唯一性太低,增加索引没有意义;
合理使用覆盖索引,SQL优化:
对于海量操作,例如新增字段,怎么实现全表更新?比较理想的办法是采用分批处理,在执行SQL时候会更加节省时间,提高效率。
聚合搜索:采用union + 操作符 ,提高命中效率。
统计优化:使用count(*),而不是count(1),使用常量统计会丢失null值数据,导致统计数据不准确。
limit优化:
limit用于分页查询存在越往后查询性能越差,解决这个问题的方法是缩小扫描范围,尽量使用唯一值来充当条件;
当然也不能忘记使用游标实现分页查询,选择合适的数据库是非常重要的。
结合我在之前公司的经验,对数据库的理解还差很远,不仅要有非常合适的数据结构来存储数据,还需要精心设计数据库,这样在开发过程中会轻松很多,同时也需要保持好奇心,深入了解为什么要用这样的表结构,采用这样的字段等等;
特别注意:部分摘抄文字版权属于原作者!!!
参考文章:www.cnblogs.com/xiaoyangjia…