首页 | 摘要显示 | 上一页 1 2 3 下一页

MySQL Archives

MySQL中的RBO特性, 数据访问方法的排名

    参考原始文档后, 自已总结一下, 有不对的地方请指正. 在数据库中对数据的访问总存在不同的方法, MySQL中比较常的有以下几种, 在这儿按从好到坏的顺序排列. 在Oracle的Concept文档中, Oracle RBO有十六种不同的访问方法, MySQL中主要有以8种:

1, 访问系统固定(Constant)表 -- system.
2, 访问用户的固定表 -- const.
3, 在主键或维一性索引上用等于查找 -- eq_ref.
4, 在非空列的索引上用等于查找 -- ref.
5, 在允许空值的索引上用等于查找 -- ref_or_null.
6, 在索引上按范转查找 -- range.
7, 扫描整个索引 -- index.
8, 扫描整全表 -- all.

    MySQL总按这个顺序来选择最佳的访问方法, 在多个表进行关联(Join)时, MySQL基本上会选择从具有最佳访问路径的表开始, 按这个顺序进行排列来确定关联顺序.

    这样的访问方法在大都数情况下都是合理的, 如果MySQL能象Oracle一样搞个统计值(CBO), 就会更好了. 另外我还不知道MySQL可不可以用Hint来指定一个表的访问方法, 到止前为止, 还是人脑比较聪明.

April 6, 2007

V$SYSSTAT, V$MYSTAT及V$SESSION

    在Oracle中我们有上面三个视图, 在进行性能调整时可以提供很有用的信息, 发挥了比较大的作用. 本站的小工具OTop就是建立在V$SYSSTAT和V$SESSTAT的基础上的. 在MySQL中也存在类似的命令:

    1, V$SYSSTAT

对应的命令为SHOW GLOBAL STATUS, 输出两列, 第一列为Statistics名称, 第二列为Statistics的值, 我现在的是5.0.37版本, 总共有248个统计值. 对这些统计值的简单介绍在手册或官方网站上可以找到, 我现在还没有仔细地阅读. 在MySQL中这些SHOW命令也是SQL, 和Oracle中的SELECT一样返回一个结果集, 并不一定得写SELECT语句来查系统表.

    2, V$MYSTAT

对应的命令为SHOW SESSION STATUS, 输出结果和前面相同. 我没有找到什么命令来输出象Oracle中V$SESSTAT那样的结果, 来查询另外一个会话的统计信息.

    3, V$SESSION

对应的命令为SHOW PROCESSLIST, 但输出的信息还不够详细, 因为在MySQL中没有Shared Pool一说, 所以这里面的输出中找不到这个会话正在执行的SQL语句, 只有一个正在执行的动作的类型, 详细的解释可以在手册中找到. 看来Oracle DBA来学MySQL时会感觉很不爽.

    要成为MySQL的DBA, 首先要明白这一些, 以充充高手的门面.

MySQL中我认为比重要的一些Status变量

1, Bytes_sent

    累计值, 向客户端发送的字节数

2, Binlog_cache_disk_use

    当前值, Binlog中(因为Binlog_cache_size不够大)用了临时文件的事务数, 如果不用Binlog则没有什么事情.

3, Connections

    累计值, 向MySQL发出连接的数量, 成功和失败的总数.

4, Created_tmp_disk_tables

    累计值?, MySQL中创建的在磁盘上的临时表的总数.

5, Flush_commands

    累计值, Flush命令执行的次数

6, Handler_commit

    累计值, 处理Commit的次数

7, Handler_rollback

    累计值, 处理Rollback的次数

8, Max_used_connections

    当前值, MySQL起动以来最大的连接数

9, Opened_tables

    当前值, 已经被打开的表的数目

10, Questions

    累计值, 客户端向服务器端发送的SQL的数目

11, Select_scan

    累计值, 进行全表扫描的数次

12, Slow_queries

    累计值, 被标记为较慢的查询数量, 执行时间大于long_query_time的设定

13, Table_locks_waited

    累计值, 请求表锁, 不能立马获得的次数

14, Threads_created

    累计值, MySQL总共打开的进程/线程数, 可以理解为当前的会话数

15, Threads_running

    当前值, 当前活动的进程/线程数

April 7, 2007

学习MySQL, 需要大家帮一点忙之一

    开始学习MySQL已经有一周多时间了, 在学习的过程中, 没有一个有一定负荷的数据库在面前, 是很抽象的, 比如我最近正在研究的MySQL中的状态变量(Status Variables), 就需要从真实的库中去取一些数据出来, 以加深一下这些状态变量的印象.

    为此我写了一小段Perl的代码(下载), 用来每隔十秒种输出一些我认为比较重要的状态变量的变化值, 不知道有谁能帮我去运行一下这个角本, 返回一二百行记录给我? 我在这儿先说声谢谢了.

    这个小工具中只是十秒钟执行一下"SHOW GLOBAL STATUS"命令, 除此之外不运行任何SQL语句, 因此不会引起什么问题, 可以放心大胆地运行. 现在输出的结构是直接打印到屏幕的, 你可以将输出重定向到一个文件, 要退出程序的运行, 请按Control+C或者向程序发送一个INT信号(kill -INT pid). 程序以MySQL的root用户本地连接, 在程序中没有指定口令, 因为我假定root用户只能本地登录, 并且不需要密码.

    对于这个程序, 我还会改进的, 如果觉得有用, 欢迎使用.

April 10, 2007

MySQL的binlog, InnoDB的日志和Oracle的日志

    MySQL中有一个binlog的概念, 用于保存对数据库所作的修改, 这点上和Oracle的归档日志很接近, 但在原理上是很不一样的. 以InnoDB为例, InnoDB本身就有log文件, 和Oracle的联机日志一样, 用完了就重用, 但binlog并不是InnoDB的日志在重用前的拷贝, 而是另外写了一个文件. 因为binlog并不是专门为InnoDB设计的, 其他的存贮引挚如MyISAM也支持binlog, 它是MySQL备份及复制支持的重要基础, 因此不同于InnoDB的日志文件.

    如果MySQL用于很重要的系统, 需要事务支持, 并且要支持联机备份, 要保证没有数据丢失, 目前来说, 一般会用InnoDB存贮引挚, 并启用binlog, 为了保证事务的数据不丢失, 就得:

1, 在每次Commit时, 将修改写入InnoDB的日志文件
2, 在每次Commit时, 将修改写入binlog文件

    而在Oracle中只是保证写入到Oracle的联机日志就够了, 因此在性能测试中, 如果启用了binlog, 性能基本上下降了一半, 因为这中间要做两次写操作. 另外现在的版本中, 一个事务不能跨越binlog, 因此启用binlog的情况下, 就要少用大事务了. 查一下资料, 原来InnoDB也可以有Archived Log模式, 但在MySQL的手册中找到这样一段话, 好象功能已经过时了?

innodb_log_archive

Whether to log InnoDB archive files. This variable is present for historical reasons, but is unused. Recovery from a backup is done by MySQL using its own log files, so there is no need to archive InnoDB log files. The default for this variable is 0.

    过多的功能支持, 必然会造成衔接的松散, 从儿得不到最大化的性能. 理论上来说不够安全的成组提交是MySQL的亮点, Oracle10g好象也有这个功能的, 只不过默认情况下是关闭的.

    从这个结构来看, MySQL不太适合用于很重要的数据, 如财务数据等.

上一页 1 2 3 下一页

当前分类: MySQL

Creative Commons License
本站版权: 共用创作 CC
署名-非商业性-相同方式分享
本站基于MT-3.36免费版
(©)版权所有, 2004 - 2008, www.AnySQL.net, 保留所有权利.
MSN: loufangxin(a)msn.com, Mail: anysql(at)126.com/support(at)iamdba.com, Skype ID:anysql