分别从范围从大到下,使用过程时间顺序,引擎,表结构,索引,查询四个层次来优化
一.架构期建表期优化
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的使用情况:
定位缓存,buffer,表锁,占有句柄等情况的优化请参考以下链接,自身也不常用到,就不拷贝了,本文仅仅是自身学习总结用,如有维权方面,请联系本人。mysql> show global status like 'key_read%';
+------------------------+-------------+
| variable_name | value |
+------------------------+-------------+
| key_read_requests | 27813678764 |
| key_reads | 6798830 |
+------------------------+-------------+
详细的优化命令:http://blog.youkuaiyun.com/jinxingfeng_cn/article/details/16878295