`
ssxxjjii
  • 浏览: 948456 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MySQL服务维护笔记(下)

阅读更多
应用的设计要点

    如果MySQL应用占用的CPU超过10%就应该考虑优化了。

    1.如果这个服务可以被其他非数据库应用代替(比如很多基于数据库的计数器完全可以用WEB日志统计代替)最好将其禁用。非用数据库不可吗?虽然数据库的确可以简化很多应用的结构设计,但本身也是一个系统资源消耗比较大的应用。在某些情况下文本,DBM比数据库是更好的选择,比如:很多应用如果没有很高的实时统计需求的话,完全可以先记录到文件日志中,定期的导入到数据库中做后续统计分析。如果还是需要记录简单的2维键-值对应结构的话可以使用类似于DBM的HEAP类型表。因为HEAP表全部在内存中存取,效率非常高,但服务器突然断电时有可能出现数据丢失,所以非常适合存储在线用户信息,日志等临时数据。即使需要使用数据库的,应用如果没有太复杂的数据完整性需求的化,完全可以不使用那些支持外键的商业数据库,比如MySQL。只有非常需要完整的商业逻辑和事务完整性的时候才需要Oracle这样的大型数据库。对于高负载应用来说完全可以把日志文件,DBM,MySQL等轻量级方式做前端数据采集格式,然后用Oracle MSSQL DB2 Sybase等做数据库仓库以完成复杂的数据库挖掘分析工作。

    有朋友和我说用标准的MyISAM表代替了InnoDB表以后,数据库性能提高了20倍。

    2.数据库服务的主要瓶颈:单个服务的连接数。对于一个应用来说,如果数据库表结构的设计能够按照数据库原理的范式来设计的话,并且已经使用了最新版本的MySQL,并且按照比较优化的方式运行了,那么最后的主要瓶颈一般在于单个服务的连接数,即使一个数据库可以支持并发500个连接,最好也不要把应用用到这个地步,因为并发连接数过多数据库服务本身用于调度的线程的开销也会非常大了。所以如果应用允许的话:让一台机器多跑几个MySQL服务分担。将服务均衡的规划到多个MySQL服务端口上:比如app_1 ==> 3301 app_2 ==> 3302...app_9 ==> 3309。一个1G内存的机器跑上10个MySQL是很正常的。让10个MySQLD承担1000个并发连接效率要比让2个MySQLD承担1000个效率高的多。当然,这样也会带来一些应用编程上的复杂度;

    3.使用单独的数据库服务器(不要让数据库和前台WEB服务抢内存),MySQL拥有更多的内存就可能能有效的进行结果集的缓存;在前面的启动脚本中有一个-O key_buffer=32M参数就是用于将缺省的8M索引缓存增加到32M(当然对于)

    4.应用尽量使用PCONNECT和polling机制,用于节省MySQL服务建立连接的开销,但也会造成MySQL并发链接数过多(每个HTTPD都会对应一个MySQL线程);

    5.表的横向拆分:让最常被访问的10%的数据放在一个小表里,90%的历史数据放在一个归档表里(所谓:快慢表),数据中间通过定期“搬家”和定期删除无效数据来节省,毕竟大部分应用(比如论坛)访问2个月前数据的几率会非常少,而且价值也不是很高。这样对于应用来说总是在一个比较小的结果级中进行数据选择,比较有利于数据的缓存,不要指望MySQL中对单表记录条数在10万级以上还有比较高的效率。而且有时候数据没有必要做那么精确,比如一个快表中查到了某个人发表的文章有60条结果,快表和慢表的比例是1:20,那么就可以简单的估计这个人一共发表了1200篇。Google的搜索结果数也是一样:对于很多上十万的结果数,后面很多的数字都是通过一定的算法估计出来的。

    6.数据库字段设计:表的纵向拆分(过渡范化):将所有的定长字段(char, int等)放在一个表里,所有的变长字段(varchar,text,blob等)放在另外一个表里,2个表之间通过主键关联,这样,定长字段表可以得到很大的优化(这样可以使用HEAP表类型,数据完全在内存中存取),这里也说明另外一个原则,对于我们来说,尽量使用定长字段可以通过空间的损失换取访问效率的提高。在MySQL4中也出现了支持外键和事务的InnoDB类型表,标准的MyISAM格式表和基于HASH结构的HEAP内存表,MySQL之所以支持多种表类型,实际上是针对不同应用提供了不同的优化方式;

    7.仔细的检查应用的索引设计:可以在服务启动参数中加入 --log-slow-queries[=file]用于跟踪分析应用瓶颈,对于跟踪服务瓶颈最简单的方法就是用MySQL的status查看MySQL服务的运行统计和show processlist来查看当前服务中正在运行的SQL,如果某个SQL经常出现在PROCESS LIST中,一。有可能被查询的此时非常多,二,里面有影响查询的字段没有索引,三,返回的结果数过多数据库正在排序(SORTING);所以做一个脚本:比如每2秒运行以下show processlist;把结果输出到文件中,看到底是什么查询在吃CPU。

    8.全文检索:如果相应字段没有做全文索引的话,全文检索将是一个非常消耗CPU的功能,因为全文检索是用不上一般数据库的索引的,所以要进行相应字段记录遍历。关于全文索引可以参考一下基于Java的全文索引引擎lucene的介绍。

    9.前台应用的记录缓存:比如一个经常使用数据库认证,如果需要有更新用户最后登陆时间的操作,最好记录更新后就把用户放到一个缓存中(设置2个小时后过期),这样如果用户在2个小时内再次使用到登陆,就直接从缓存里认证,避免了过于频繁的数据库操作。

    10.查询优先的表应该尽可能为where和order by字句中的字段加上索引,数据库更新插入优先的应用索引越少越好。

    总之:对于任何数据库单表记录超过100万条优化都是比较困难的,关键是要把应用能够转化成数据库比较擅长的数据上限内。也就是把复杂需求简化成比较成熟的解决方案内。

一次优化实战

    以下例子是对一个论坛应用进行的优化:

    1.用Webalizer代替了原来的通过数据库的统计。

    2.首先通过TOP命令查看MySQL服务的CPU占用左右80%和内存占用:10M,说明数据库的索引缓存已经用完了,修改启动参数,增加了-O key_buffer=32M,过一段时间等数据库稳定后看的内存占用是否达到上限。最后将缓存一直增加到64M,数据库缓存才基本能充分使用。对于一个数据库应用来说,把内存给数据库比给WEB服务实用的多,因为MySQL查询速度的提高能加快web应用从而节省并发的WEB服务所占用的内存资源。

    3.用show processlist;统计经常出现的SQL:

    每分钟运行一次show processlist并记录日志:

    * * * * * (/home/mysql/bin/mysql -uuser -ppassword < /home/chedong/show_processlist.sql >> /home/chedong/mysql_processlist.log)

    show_processlist.sql里就一句:

    show processlist;

    比如可以从日志中将包含where的字句过滤出来:
    grep where mysql_processlist.log

    如果发现有死锁,一定要重新审视一下数据库设计了,对于一般情况:查询速度很慢,就将SQL where字句中没有索引的字段加上索引,如果是排序慢就将order by字句中没有索引的字段加上。对于有%like%的查询,考虑以后禁用和使用全文索引加速。

    4.还是根据show processlist;看经常有那些数据库被频繁使用,考虑将数据库拆分到其他服务端口上。

    MSSQL到MySQL的数据迁移:ACCESS+MySQL ODBC Driver

    在以前的几次数据迁移实践过程中,我发现最简便的数据迁移过程并不是通过专业的数据库迁移工具,也不是MSSQL自身的DTS进行数据迁移(迁移过程中间会有很多表出错误警告),但通过将MSSQL数据库通过ACCESS获取外部数据导入到数据库中,然后用ACCESS的表==>右键==>导出,制定ODBC,通过MySQL的DSN将数据导出。这样迁移大部分数据都会非常顺利,如果导出的表有索引问题,还会出添加索引提示(DTS就不行),然后剩余的工作就是在MySQL中设计字段对应的SQL脚本了。
分享到:
评论

相关推荐

    MySQL服务维护笔记.zip_mysql 维护

    MySQL服务维护笔记

    mysql优化笔记+资料

    这些笔记涵盖了MySQL优化的主要方面,包括查询优化、SQL编写技巧、数据库设计、存储引擎选择、服务器配置、硬件升级、定期维护以及使用各种工具进行监控和调优。通过这些方法,你可以有效地提升MySQL数据库的运行...

    大神写的MySQL DBA学习笔记

    MySQL DBA,全称Database Administrator(数据库管理员),是专门负责管理和维护MySQL数据库系统的专业人士。这份“大神写的MySQL DBA学习笔记”无疑是深入理解和掌握MySQL技术的重要资源,尤其适合那些希望提升自己...

    MySQL学习笔记 MySQL学习笔记

    在Windows上安装MySQL可以选择不同的版本,然后通过服务管理工具或命令行来启动和停止MySQL服务。用户可以通过MySQL自带的客户端或Windows的命令行工具登录和退出MySQL服务器。 五、MySQL基本操作 1. 查看所有...

    狂神MySQL笔记.rar

    【狂神MySQL笔记】是一份全面且深入的MySQL学习资源,涵盖了从基础到高级的各种MySQL技术知识点。作为数据库领域的核心工具,MySQL因其高效、稳定、开源等特性,被广泛应用于各种规模的企业和项目中。这份笔记旨在...

    黑马MySQL数据库笔记.doc

    黑马MySQL数据库笔记 MySQL数据库笔记是黑马程序员编写的数据库笔记,涵盖了数据库语句的介绍、数据库操作等优秀的操作,旨在帮助读者更好地理解数据库基础。下面是笔记的详细介绍: 数据库介绍 在了解 MySQL ...

    深入浅出MySQL-读书笔记byCZF

    首先,MySQL的安装与配置是基础中的基础,这包括了解MySQL的性能优势,以及在Linux环境下如何启动、重启和关闭MySQL服务。例如,可以使用service mysql start来启动服务,使用service mysql restart来重启服务,以及...

    MySQL核心技术学习笔记

    ### MySQL核心技术学习笔记 #### 一、为什么要学习数据库 学习数据库的重要性主要体现在以下几个方面: 1. **持久化数据到本地**:数据库能够将应用程序产生的数据持久化存储在磁盘上,即使系统重启也不会丢失...

    mysql DBA学习笔记

    MySQL DBA,全称Database Administrator(数据库管理员),是管理和维护MySQL数据库系统的关键角色。这份"超经典mysql DBA学习笔记"涵盖了成为一名优秀DBA所需掌握的众多知识点,旨在帮助学习者深入理解MySQL数据库...

    MySQL索引 使用笔记

    【MySQL索引 使用笔记】 MySQL数据库是世界上最流行的开源关系型数据库管理系统之一,其高效的数据查询能力在很大程度上依赖于索引。本笔记将深入探讨MySQL中的索引使用,旨在帮助你提升数据库性能。 1. 索引的...

    超经典mysql dba 学习笔记

    MySQL DBA,全称Database Administrator,是数据库管理员的缩写,是负责管理和维护数据库系统的关键角色。本学习笔记聚焦于MySQL这一广泛使用的开源关系型数据库管理系统,为有志成为DBA或者希望提升MySQL技能的读者...

    MySQL语句汇总及重要笔记

    ### MySQL语句汇总及重要笔记知识点 #### 一、MySQL简介 MySQL是一个广泛使用的开源关系型数据库管理系统(RDBMS)。它由瑞典的MySQL AB公司开发,并被Oracle公司收购。MySQL因其高性能、可靠性和易用性而在全球...

    MySQL数据库学习笔记.pdf

    同时,MySQL的数据库和表在操作系统下对应为目录和文件,所以它们的大小写敏感性取决于操作系统的规则。 索引是提升数据库查询性能的关键,MySQL支持多种类型的索引,如B-tree、Hash和Full-text索引。用户变量用@...

    MySQL笔记.md

    ### MySQL学习笔记详解 #### 一、学习数据库的重要性 ##### 1.1 为何学习数据库 - **岗位需求**:随着互联网技术的发展,几乎所有软件项目都需要数据库的支持。 - **大数据时代的趋势**:“得数据者得天下”,数据...

    MySQL笔记合集.pdf

    "MySQL笔记合集.pdf" MySQL 是一款开源的关系数据库管理系统(RDBMS),是一种relational database management system(RDBMS),是当下最流行的数据库管理系统之一。MySQL 的主要特点是开源、免费、跨平台、支持...

    MYSQL读书笔记整理

    - **外键约束**:InnoDB支持外键,用于维护引用完整性和数据关联性,是关系数据库设计中的关键元素。 - **崩溃恢复**:InnoDB有内置的崩溃恢复机制,通过redo logs和undo logs保证数据在系统故障后的安全性。 2. ...

    mysql 笔记

    ### MySQL 笔记知识点梳理 #### 一、数据库概述与分类 - **Microsoft SQL Server**:易用性好,适合企业级应用。 - **MySQL**:开源免费,广泛应用于中小型项目及个人项目。 - **Oracle**:适用于Java开发者,特别...

    MySQL服务维护笔记第1/2页

    MySQL服务维护笔记主要涵盖了几大核心点,包括服务规划设计、安装配置、系统升级与数据迁移、备份与恢复、数据库应用设计、以及优化实战。这里详细展开这些知识点: 1. **服务规划设计**: - 高负载环境下的架构...

    mysql的日常笔记

    根据给定的信息,“mysql的日常笔记”主要涵盖了MySQL数据库中常用的SQL查询语句及操作技巧。下面将对这些内容进行详细的解析与总结。 ### 一、基础查询 #### 1. 查询所有列 - **语句**: `SELECT * FROM goods;` -...

Global site tag (gtag.js) - Google Analytics