mysql设计与优化

  
  
           
  
  
  1. 普通MySQL运行,数据量和访问量不大的话,是足够快的,可是当数据量和访问量剧增的时候,那么就会明显发现MySQL很慢,甚至down掉,那么就要考虑优化咱们的MySQL了。 
  2.  
  3. 优化无非是从三个角度入手: 
  4. 第一个是从硬件,增长硬件,增长服务器 
  5. 第二个就是对咱们的MySQL服务器进行优化,增长缓存大小,开多端口,读写分开 
  6. 第三个就是咱们的应用优化,创建索引,优化SQL查询语句,创建缓存等等 
  7.  
  8. 我就简单的说说SQL查询语句的优化。由于若是咱们 Web服务器比数据库服务器多或者性能优良的话,咱们彻底能够把数据库的压力转嫁到Web服务器上,由于若是单台MySQL,或者 Master/Slave 架构的数据库服务器都负担比较重,那么就能够考虑把MySQL的运算放到Web服务器上去进行。固然了,若是你Web服务器比数据库服务器差,那就把压力 放在数据库服务器上吧,呵呵。 
  9.  
  10. 若是是把MySQL服务器的压力放在Web服务器 上,那么不少运算就须要咱们的程序去执行,好比Web程序中所有交给PHP脚本去处理数据。单台MySQL服务器,查询、更新、插入、删除都在一台服务器 上的话,访问量一大,你会明显发现锁表现象,当对一个表进行更新删除操做的时候,就会拒绝其余操做,这样就会致使锁表,解决这个问题最简单直接的办法就是 拿两台MySQL服务器,一台负责查询(select)操做,另一台负责更改(update/delete/insert),而后进行同步,这样可以避 免锁表,若是服务器更多,那么就更好处理了,能够采用分布式数据库架构和数据的散列存储,下面咱们会简单说一下。 
  11.  
  12. 1、SQL的优化和注意事项 
  13.  
  14. 如今咱们假设咱们只有一台MySQL服务器,全部的select/update/insert/delete操做都是在这上面进行的,咱们同时有三台Web服务器,经过DNS轮巡来访问,那么咱们如何进行咱们应用程序和SQL的优化。 
  15.  
  16. 1. Where条件 
  17. 在查询中,WHERE条件也是一个比较重要的因素,尽可能少而且是合理的where条件是很重要的,在写每个where条件的时候都要仔细考虑,尽可能在多个条件的时候,把会提取尽可能少数据量的条件放在前面,这样就会减小后一个where条件的查询时间。 
  18. 有时候一些where条件会致使索引无效,当使用了Mysql函数的时候,索引将无效,好比:select * from tbl1 where left(name, 4) = 'hylr',那么这时候索引无效,还有就是使用LIKE进 行搜索匹配的时候,这样的语句索引是无效的:select * from tbl1 where name like '%xxx%',可是这样索引是有效的:select * from tbl1 where name like 'xxx%',因此谨慎的写你的SQL是很重要的。 
  19.  
  20. 2. 关联查询和子查询 
  21. 数据库一个很重要的特色是关联查询,LEFT JOIN 和全关联,特别是多个表进行关联,由于每一个关联表查询的时候,进行扫描的时候都是一个笛卡尔乘积的数量级,扫描数量很大,若是确实是须要进行关联操做,请给where或者on的条件进行索引。 
  22. 关联操做也是可能交给应用去操做的,看数据量的大小,若是数据量不是很是大,好比10万条如下,那么就能够交给程序去处理(totododo提出笔误,特此修正),程序分别提取左右两个表的数据,而后进行循环的扫描处理,返回结果,这个过程一样很是耗费Web服务器的资源,那么就须要取决于你愿意把压力放在Web服务器上或者数据库服务器上了。 
  23. 子查询是在mysql5中支持的功能,好比:select * from tbl1 where id in(select id from tbl1),那样效率是很是很是低,要尽可能避免使用子查询,要是我,绝对不用,呵呵。 
  24.  
  25. 3.  一些耗费时间和资源的操做 
  26. SQL语句中一些浪费的操做,好比 DISTINCT、COUNT、GROUP BY、各类MySQL函数。这些操做都是比较耗资源的,我想应用最多的是count字句吧,若是使用count,尽可能不要count(*),最好count一个字段,好比count(id),或者count(1),(据totododo测 试效率实际上是同样的),一样可以起到统计的做用。若是不是十分必要,尽可能不要使用distinct操做,就是提取惟一值,你彻底能够把这个操做交给脚本程 序去执行提取惟一值,减小MySQL的负担。group by 操做也是,确实须要分组的话,请谨慎的操做,若是是小批量的数据,能够考虑交给脚本程序去作。 
  27. 至于MySQL的函数,估计不少经常使用,好比有人喜欢把截取字符串也交给MySQL去操做,或者时间转换操做,使用比较多的函数像 SUBSTR(), CONCAT(), DATE_FORMAT(), TO_DAYS(), MAX(), MIN(), MD5() 等等,这些操做彻底能够交给脚本程序去作,减轻MySQL的负担。 
  28.  
  29. 4. 合理的创建索引 
  30. 索引的提高速度的一个很是重要的手段,索引在对一些常常进行select操做,而且值比较惟一的字段是至关有效的,好比主键的id字段,惟一的名字name字段等等。 
  31. 但 是索引对于惟一值比较少的字段,好比性别gender字段,寥寥无几的类别字段等,意义不大,由于性别是50%的概率,索引几乎没有意义。对于 update/delete/insert很是频繁的表,创建索引要慎重考虑,由于这些频繁的操做一样对于索引的维护工做量也是很大的,最后反而得不偿 失,这个须要本身仔细考虑。索引一样不是越多越好,适当的索引会起到很关键的做用,不适当的索引,反而减低效率维护,增长维护索引的负担。 
  32.  
  33. 5. 监控sql执行效率 
  34. 在select语句前面使用EXPLAIN字句可以查看当前这个select字句的执行状况,包括使用了什么操做、返回多少概率、对索引的使用状况如何等等,可以有效分析SQL语句的执行效率和合理程度。 
  35. 另外使用MySQL中自己的慢查询日志:slow-log,一样可以记录查询中花费时间比较多的SQL语句,好对相应的语句进行优化和改写。 
  36. 另外在MySQL终端下,使用show processlist命令可以有效的查看当前MySQL在进行的线程,包括线程的状态,是否锁表等等,能够实时的查看SQL执行状况,同时对一些锁表操做进行优化。 
  37.  
  38. 2、数据库服务器的架构和分布想法 
  39.  
  40. 对于服务器的架构设计,这个实际上是比较重要的,一个合理的设计,可以让应用更好的运行。固然,架构的设计,取决于你的应用和你硬件的实际状况。我就简单的说说几种不一样的数据库架构设计方式,权当是一个我的的想法,但愿可以有帮助。 
  41.  
  42. 1. 单台服务器开多进程和端口 
  43. 单台MySQL服务器,若是使用长连接等等都没法解决负载太大,链接太多的问题,不凡考虑采用一台MySQL上使用多个端口开启多个MySQL守护进程的方法来缓解压力。固然,前提是你的应用必须支持多端口,而且你的cpu和内存足够运行多个守护进程。 
  44. 优势 是可以很好的缓解暂时服务器的压力,把不一样的操做放在不一样的端口,或者把不一样的项目模块放在不一样的端口去操做,良好的分担单个守护进程的压力。 
  45. 缺点 是数据可能会产生紊乱,同时可能会致使不少未知的莫名错误。呵呵 
  46.  
  47. 2. 使用Master/Slave的服务器结构 
  48. Mysql 自己具备同步功能,彻底能够利用这个功能。构建 Master/Slave 的主从服务器结构,最少只须要两台MySQL服务器,咱们能够把 Master 服务器用户更新操做,包括 update/delete/insert,把Slave服务器用于查询操做,包括 select 操做,而后两机进行同步。 
  49. 优势 是合理的把更新和查询的压力分担,而且可以避免锁表的问题。 
  50. 缺点 是更新部实时,若是网络繁忙,可能会存在延迟的问题,而且任何一台服务器down掉了都很麻烦。 
  51.  
  52. 3. 使用分布式的散列存储 
  53. 这 种结构适合大数据量,而且负载比较大,而后服务器比较充足的状况。分布式存储结构,简单的能够是多台服务器,每台服务器功能是相似的,可是存储的数据不一 样,好比作一个用户系统,那么把用户ID在1-10万之内的存储在A服务器,用户ID在10-20万存储在B服务器,20-3-万存储在C服务器,以此类 推。若是每一个用户访问的服务器不足,能够构建组服务器,就是每组用户拥有多台服务器,好比能够在某用户组创建两台MySQL服务器,一台Master,一 台Slave,一样分离他们的更新和查询操做,或者能够设计成双向同步。同时,你的应用程序必须支持跨数据库和跨服务器的操做能力。 
  54. 优势 是服务器的负载合理的被平摊,每台服务器都是负责一部分用户,若是一台服务器down掉了,不会影响其余用户ID的用户正常访问。同时添加节点比较容易,若是又增长了10万用户,那么又能够增长一个节点服务器,升级很方便。 
  55. 缺点 是任何一台数据库服务器down掉或者数据丢失,那么这部分服务器的用户将很郁闷,数据都没了,固然,这个须要良好的备份机制。 
相关文章
相关标签/搜索