如何对MySQL进行优化
数据库和数学里面的集合非常的相似。
数据库是由数据表组成的集合,数据表又是由数据行和数据列组成的集合。
MYSQL的优化主要包括以下几个方面:
1,索引是MYSQL中加快检索速度的最大因素。
2,编写能够影响数据库服务器调度机制的查询以便让来自多个客户程序的查询能够更好的协调工作。
3,修改MYSQL服务器的配置参数提高工作效率
4,探究底层硬件的所做作为和绕过各种物理系能的方法以改善性能。
下面对各个方面详细介绍
对表进行合理的索引
1,索引是可以用来加快查询速度的最重要的指标
没有进行索引的表列,在进行搜索时是进行“全表扫描”,对表的列索引以后,MySQL能知道每一个列值的具体位置,所以当有100条数据时,不进行索引,mysql将扫描100次,而进行了索引[hash]只需要一次就够了。【注:不是所有的列都能进行有效的索引】
2,索引的结构
MyISAM或是ISAM数据表,其数据行将保存在数据文件里,其索引值保存在索引文件里,存储结构是键-》值。
InnoDB处理程序则是把所有InnoDB数据表的数据值和索引值都放在同一个表空间里。
3,合理的索引
关连查询的时候,索引的价值越大。
索引应该创建在搜索、排序、归组等操作所涉及的数据列上。
如何编写良好的SQL语句
学会使用EXPLAIN语句,对于大部分情况只要把EXPLAIN 放在SELECT 前面你就可以得知这条查询语句的效率。
1,尽量对同类型的数据比较
char(10)与varchar(10)是同类型的数据,但char(12)与char(12)却不是同类型的数据。如果参与比较的两个数据列的类型不相同,程序将无法获得索引带来的好处。
2,尽量让有索引的数据列在比较表达式中单独出现
例:WHERE mycol<4/2与WHERE mycol*2<4是相同的结果,但是第二条语句将无法使用索引带来的好处,MySQL会先检索出mycol的值*2再与4做比较。
3,尽量不要在LIKE模式的开头使用通配符
WHERE col_name LIKE ‘%string%’,如果要找到字符’string’,不论它出现在col_name列中的什么位置,那么使用这个表达式是正确的,但千万不要养成在LIKE模式两端随手放上一个%字符的习惯,因为这会降低查询的性能。
4,不要乱用MySQL的类型自动转换功能
SELECT * FROM mytable WHERE my_col = 4;
SELECT * FROM mytable WHERE my_col =’4′;
自动转换功能发挥作用了,索引也就失效了。
数据列类型与查询效率
1,尽量选用尺寸较小的数据列
2,如果可以选择数据行的存储格式,就应该尽量选用最适合于数据表类型的格式。
example:如果打算用MyISAM或是ISAM数据表,就应该尽量选用固定长度的数据列char而不是可变的varchar,但是对于InnoDB来讲,varchar与char都是一样的。
3, 尽量把数据列声明为NOT NULL.
4, 考虑用ENUM数据格式
5,用OPTIMIZE TABLE 语句对用以出现碎片的数据表进行整理,特别是那些可变长度的数据类容易出现碎片。
有效的加载数据
INSERT INTO table_name VALUES (….),(….),(….);
如果必须使用多条INSERT语句,请尽量把他们集中起来一起以减少索引的刷新次数,对支持事务处理的表InnoDB,应该把多条INSERT 放在一个事物中而不是在自动提交模式下。
系统管理员所能完成的优化
增加服务器的缓存区容量
数据表缓存区里是放着与打开的数据表有关的各种信息,它的容量由服务器变量table_cache控制
为了进行与索引有关的操作,MyISAM和ISAM数据表处理程序需要把索引块缓存在键字缓冲区key buffer里。
对于InnoDB来讲,有专门的数据与索引的缓冲区,他们的容量分别由服务器的innodb_buffer_pool_size和innodb_cahce_size控制。
对于数据库只有一种类型的数据库,那么最好把其他的类型删除,并设置上面的参数,使其最优。
查询缓存区
当第一次执行某给定的SELECT语句的时候,服务器会记住这条查询命令的文本和它返回的结果,由服务器参数query_cache_size控制。
硬件相关的优化
加内存,购置高速硬盘,硬盘读写活动分散到多个物理设备上,提高并行操作能力,使用多处理器。
如果是大型网站的话读写分离和分表的处理是必须的,有时间下次再写。
Tags: mysql提速










Comments