一、使用索引
尽量避免全表扫描,首先应该考虑在where及order by,group by设计的列上建立索引。
二、优化SQL语句
- 通过explain(查询优化神器)来查看SQL语句的执行效果,可以帮助选择更好的索引和优化查询语句。例如:expain select * from X
- 任何地方都不要使用select * from X,用具体的字段代替 * ,不要返回任何用不到的字段
- 不在索引列做运算或者使用函数
- 查询尽可能使用limit减少返回的行数,减少数据传输时间和带宽浪费
三、优化数据库对象
- 优化表的数据类型。
能小就用小。使用正确的表示和存储数据的最短类型。 - 对表进行拆分
- 垂直拆分
把主键和一些列放在一个表中,然后把主键和另外的列放在另一个表中。如果一个表中某些列常用,而另外一些不常用,则可以采用垂直拆分。 - 水平拆分
根据一列或者多列数据的值把数据行放到二个独立的表中。
- 垂直拆分
- 使用中间表来提高查询速度
创建中间表,表结构和源表结构完全相同,转移要统计的数据到中间表,然后在中间表上进行统计,得出想要的结果。
四、内存的优化
- CPU的优化
选择多核和主频高的CPU - 内存的优化
使用更大的内存。将尽量多的内存分配给MySQL做缓存。 - 磁盘I/O的优化
- 使用磁盘阵列
- 调整磁盘调度算法
- MySQL自身的优化
对MySQL自身的优化主要是对其配置云讯my.cnf中的各项参数进行优化调整。如指定MySQL查询缓冲区的大小,指定MySQL允许的最大连接进程树等。 - 应用优化
- 使用数据库连接池
- 使用查询缓存
它的作用是存储select查询的文本及其相应结果。如果随后收到一个相同的查询,服务器会从查询缓存中直接得到查询结果。查询缓存适用的对象时更新不频繁的表,当表中数据更改后,查询缓存中的相关条目就会被清空。
数据库分表、分区、分库
分表见上述
分区就是把一张表的数据分成多个区块,这些区块可以在一个磁盘上,也可以在不同的磁盘上,分区后,表面上还是一张表,但数据散列在多个位置,这样一来,多块硬盘同时处理不同的请求,从而提高磁盘I/O的读写性能,实现比较简单。包括水平分区和垂直分区
分库就是根据业务不同把相关的表切分到不同的数据库中,比如web、bbs、blog等库。