mysql性能优化

分别从范围从大到下,使用过程时间顺序,引擎,表结构,索引,查询四个层次来优化

一.架构期建表期优化

1.服务器硬件选择,当前服务器的性能是否能够承担目标需求的应用场景

2.mysql配置优化,配置最大并发数,调整缓存大小

3.选择合适存储引擎,MyISAM适合大量查询的应用场景,避免insert、update,add操作,这样会激发表锁,导致整体不可用状态

InnoDB是行锁,适合大量uddate,insert的操作,查询效率不是很好

4.实行读写分离保证查询效率,把last_logintime这种需要频繁更新,会破坏查询缓存的字段避免放在高频率查询表里

5.表设计合理化,符合3NF标准,避免一个表包含一百多个字段,合理的实行(水平分割,垂直分割)

6.比如用户角色创建这种,需要初始化很多信息,多张表的功能进行存储过程模块化

7.建表的时候尽可能的使用 NOT NULL,null需要额外的空间,在比较的时候复杂,严重影响查询性能

8.把IP地址存成 UNSIGNED INT,能用INT的地方就不要使用CHAR,尤其是VARCHAR

9.使用固定长度的表会更快,尽量避免使用VARCHAR,TEXT,BLOB类型,否则MySQL 引擎会用另一种方法来处理

10.使用尽量小的字段,越小越快使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 会更经济一些,如果你不需要记录时间,使用 DATE 要比 DATETIME 好得多

11.为业务的查询场景,创建合适的索引,避免重复的索引,删除不用的索引

12.我们应该为数据库里的每张表都设置一个ID做为其主键,而且最好的是一个INT型的(推荐使用UNSIGNED),并设置上自动增加的AUTO_INCREMENT标志,在关联表的时候会起到很好的作用

13.慎重使用永久链接,因为只有有限的链接数,内存问题,文件句柄数,等等原因会让永久链接造成很多问题

二。查询期优化

1.避免使用select*,需要什么字段查询什么字段

2.为查询缓存优化你的查询,避免查询条件中出现像 NOW() 和 RAND() 或是其它的诸如此类的SQL函数都不会开启查询缓存,因为这些函数的返回是会不定的易变的,用一个变量来代替MySQL的函数,从而开启缓存。

3.当只要一行数据时使用 LIMIT 1 。$r = mysql_query("SELECT 1 FROM user WHERE country = 'China' LIMIT 1");

4.注意范围查询,搜索字串 “last_name LIKE ‘a%’”是利用了索引;没有用着索引的例子“WHERE post_content LIKE ‘%apple%’”

5.千万不要 ORDER BY RAND(),这种严重影响效率的做法

6.为了是索引起作用,注意where条件的字段与索引字段一样,如果需要排序,尽量使用索引排序,order by顺序与索引顺序一致

7.使用EXPLAIN你的SELECT查询,检查索引是否合理,是否需要新增索引


二。维护期期优化(当业务表现很慢的时候再去优化)

1.搜索当前的mysql服务器的状态信息和配置信息

mysql> show global status; //列出mysql服务器运行各种状态值

mysql> show variables;   //查询mysql服务器配置信息

mysql> show variables like 'slow%';
+---------------------+-----------------------------+
| Variable_name       | Value                       |
+---------------------+-----------------------------+
| slow_launch_time    | 2                           |
| slow_query_log      | ON                          |
| slow_query_log_file | /data1/mysql/mysql_slow.log |
+---------------------+-----------------------------+
3 rows in set (0.00 sec)


mysql> show global status like 'slow%';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| Slow_launch_threads | 0     |
| Slow_queries        | 4811  |
+---------------------+-------+
2 rows in set (0.00 sec)


2.连接数优化

遇见”mysql: error 1040: too many connections”的情况,一种是访问量确实很高,mysql服务器抗不住,这个时候就要考虑增加从服务器分散读压力,另外一种情况是mysql配 置文件中max_connections值过小:

mysql> show variables like 'max_connections';
+-----------------+-------+
| variable_name    | value |
+-----------------+-------+
| max_connections | 256   |
+-----------------+-------+


3.key_buffer_size

key_buffer_size是对myisam表性能影响最大的一个参数,下面一台以myisam为主要存储引擎服务器的配置:

mysql> show variables like 'key_buffer_size';

+-----------------+------------+
| variable_name    | value       |
+-----------------+------------+
| key_buffer_size | 536870912 |
+-----------------+------------+

分配了512mb内存给key_buffer_size,我们再看一下key_buffer_size的使用情况:

mysql> show global status like 'key_read%';
+------------------------+-------------+
| variable_name           | value        |
+------------------------+-------------+
| key_read_requests       | 27813678764 |
| key_reads               | 6798830      |
+------------------------+-------------+

定位缓存,buffer,表锁,占有句柄等情况的优化请参考以下链接,自身也不常用到,就不拷贝了,本文仅仅是自身学习总结用,如有维权方面,请联系本人。

详细的优化命令:http://blog.csdn.net/jinxingfeng_cn/article/details/16878295

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值