MySQL数据库优化总结(三)

2014-11-24 10:21:01 · 作者: · 浏览: 1
应以STRAIGHT_JOIN而不只是SELECT开头。

EXPLAIN为用于SELECT语句中的每个表返回一行信息。表以它们在处理查询过程中将被MySQL读入的顺序被列出。MySQL用一遍扫描多次联 接(single-sweep multi-join)的方式解决所有联接。这意味着MySQL从第一个表中读一行,然后找到在第二个表中的一个匹配行,然后在第3个表中等等。当所有的 表处理完后,它输出选中的列并且返回表清单直到找到一个有更多的匹配行的表。从该表读入下一行并继续处理下一个表。

当使用EXTENDED关键字时,EXPLAIN产生附加信息,可以用SHOW WARNINGS浏览。该信息显示优化器限定SELECT语句中的表和列名,重写并且执行优化规则后SELECT语句是什么样子,并且还可能包括优化过程的其它注解。

如果什么都做不了,试试全索引扫描

如果一个语句实在不能优化了,那么还有一个方法可以试试:索引覆盖。

如果一个语句可以从索引上获取全部数据,就不需要通过索引再去读表,省了很多I/O。比如这样一个表

\
如果我要统计每个学生每道题的得分情况,我们除了要给每个表的主键外键建立索引,还要对【得分情况】的实际得分字段索引,这样,整个查询就可以从索引得到数据了。



三、数据库参数配置

最重要的参数就是内存,我们主要用的innodb引擎,所以下面两个参数调的很大

# Additional memory pool that is used by InnoDB to store metadata

# information. If InnoDB requires more memory for this purpose it will

# start to allocate it from the OS. As this is fast enough on most

# recent operating systems, you normally do not need to change this

# value. SHOW INNODB STATUS will display the current amount used.

innodb_additional_mem_pool_size = 64M

# InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and

# row data. The bigger you set this the less disk I/O is needed to

# access data in tables. On a dedicated database server you may set this

# parameter up to 80% of the machine physical memory size. Do not set it

# too large, though, because competition of the physical memory may

# cause paging in the operating system. Note that on 32bit systems you

# might be limited to 2-3.5G of user level memory per process, so do not

# set it too high.

innodb_buffer_pool_size = 5G

对于myisam,需要调整key_buffer_size

当然调整参数还是要看状态,用show status语句可以看到当前状态,以决定改调整哪些参数

Cretated_tmp_disk_tables 增加tmp_table_size

Handler_read_key 高表示索引正确Handler_read_rnd高表示索引不正确

Key_reads/Key_read_requests 应小于0.01 计算缓存损失率,增加Key_buffer_size

Opentables/Open_tables 增加table_cache

select_full_join 没有实用索引的链接的数量。如果不为0,应该检查索引。

select_range_check 如果不为0,该检查表索引。

sort_merge_passes 排序算法已经执行的合并的数量。如果该值较大,应增加sort_buffer_size

table_locks_waited 不能立即获得的表的锁的次数,如果该值较高,应优化查询

Threads_created 创建用来处理连接的线程数。如果Threads_created较大,要增加thread_cache_size值。

缓存访问率的计算方法Threads_created/Connections。



四、合理的硬件资源和操作系统

如果你的机器内存超过4G,那么毋庸置疑应当采用64位操作系统和64位mysql

读写分离

如果数据库压力很大,一台机器支撑不了,那么可以用mysql复制实现多台机器同步,将数据库的压力分散。
\

Master

Slave1

Slave2

Slave3

主库master用来写入,slave1—slave3都用来做select,每个数据库分担的压力小了很多。

要实现这种方式,需要程序特别设计,写都操作master,读都操作slave,给 程序开发带来了额外负担。当然目前已经有中间件来实现这个代理,对程 序来读写哪些 数据库是透明的。官方有个 mysql-proxy,但是还是alpha版本的。新浪有个amobe for mysql,也可达到这个目的,结构如下
\

使用方法可以看amobe的手册