- 论坛徽章:
- 72
|
本帖最后由 cjfeii 于 2015-12-14 11:54 编辑
1.如果是你,你怎么处理慢查询引起的问题,并且在以后避免这种情况发生?
如果确定是由于慢查询引起的MySQL数据库性能问题,首先通过“show processlist”以及“slow.log”确定具体哪些慢查询,确定之后根据慢查询不同的情况去优化:
1. 如果是SQL有问题,那么就优化SQL;
2. 优化之后的SQL,可以通过添加索引来提升查询性能,但是,添加索引是一把双刃剑:会降低“insert/update”的性能,并且还要占用额外的存储空间,所以谨慎的对待添加索引;
3. 如果添加索引不能很好的提高性能,那么可以根据数据的读写特点以及数据规模去选择合适的存储引擎,虽然在目前innodb引擎性能很好,支持事务,用的也很广泛,但是也不要忽视其他的存储引擎的优势,比如TokuDB的高压缩比以及高insert属性等;
4. 如果数据规模超出了单机MySQL存储容量范围,那么就需要扩展机器做集群或者替换MySQL数据库寻求更适合的存储数据库;
2.除了慢查询,还有哪些情况会导致MySQL卡顿,查询较慢?
引起MySQL卡顿的情况有很多,但是根本原因主要就是CPU以及IO的抢占。比如:
1. 大规模的写会占用大量的IO资源会引起MySQL卡顿;
2. 如果MySQL所在的服务器上运行着其他的应用程序,并占用太多的CPU或是IO,那么也会导致MySQL查询较慢;
3. 等等。
生产环境永远是最复杂的系统,线上MySQL卡顿也会有多种原因,这就使得掌握查找卡顿原因的方法尤为重要,如:show processlist,top/htop,iostat/iotop,strace等()。
3.针对于数据库优化,您有哪些比较实用的建议和想法?
数据库优化不是一朝一夕就能做好,在平时的工作中要一点一滴的来做,不同部门协同来做:
1. 数据库设计的时候:合理设计表结构以及合理访问数据库表;
2. 数据库运行过程中,注意性能的监控,最直观的就是:slowlog和show processlist,还需要注意其他指标的波动(disk, io, net等);
3. 优化的时候,要全盘考虑,避免只考虑将来而忘掉过去(程序员会发疯的);
4. 等等。
4.结合生产环境,您觉得MySQL,较于PG NOsql DB2 Sybase MongoDB Oracle等数据库来,他的优点在哪?在什么情况下你会使用其它类型的DB
相对于其他关系型数据库,主要就是:社区比较活跃,软件更新快,从业人员比较多,还有就是免费。
和nosql数据库相比,就是:支持事务,复杂的sql,稳定。
具体选用哪种DB,主要有三个因素——业务数据特点、DB的成熟度、团队的技术栈。比较主流的SQL+NOSQL就是:MySQL+Redis等。
5.如果您是数据库的设计者,您会去怎么设计数据库的引擎和结构?
主要看对数据库的定位,不同的定位导致不同的底层设计(引擎和结构),如果侧重点是事务型,那么就是MySQL、PG的设计等,非事务的话可以考虑nosql的存储模式(Log Structured Merge等)。
我说一个我自己工作中用到的场景:
有一个特别大的表,这个表用于保存终端上传的数据,只增加不修改,并主要承载一些查询业务(主要是范围查找),目前这张表的存储引擎是innodb。其实不管是事务型的innodb还是非事务型的MyISAM,底层都是B-树或是B+树的存储结构(其他大部分数据库系统也是这样),都是平衡树,写的过程中总会有blance的时候,而且会导致逻辑上相邻的数据在物理上不相邻,在范围访问的过程中会造成很多的随机IO,使得性能有所降低,针对这样的情况有没有更好的存储方式呢?
抛砖引玉:待后者续。。。 |
|