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

MySQL Archives

April 2, 2007

将要学习MySQL, 请推荐有关图书!

    最近要学学MySQL了. 从最小处来讲, 这个Blog也是用MySQL的. 从大处讲, MySQL可以免费使用, 你不需要为此支付许可证的费用(至少目前如此). 只要你有足够的信心和实力, 完全可以将部分数据存放在MySQL中, 以降底公司的营运成本. 学习MySQL是可以省钱地!.

    我们之中很多人都学过或用过MySQL, 因此想请大家推荐一下MySQL方面的精品图书. 至于我理想中的书是怎么样的呢? 应当象我最推崇的Oracle Concept那样的, 可以称之为MySQL Concept, 能够讲解一下MySQL最重要的一些概念, 进程, 内存, 结构等方面的的, 希望从这些资料中了解MySQL的一些构架.

    至于目前的MySQL水平, 只了解一些概念, 关于MySQL的进程, 内存及架构方面一点都不清楚. 初步地看了一下和内存有关的参数, 很晕! 有Myisam有关的内存参数, 有ndb有关的参数, 还有InnoDB有关的参数, 还有在MySQL中是如何处理SQL的? 还有处理join和sort的一些内存参数, 实在是比较难以理解. 每一个进程连接上来, 执行排序或关联操作时, 使用的内存如何计算?

    关于一些数据类型, 或语句语法的, 则我想查查网站上的标准文档就足够了. 关于MySQL的备份也是很值得商量的, 因为备份总是第一位的. 当然最好是你分享你的亲身经历, 没有什么东西比经验更宝贵了. 谢谢!

    有兴趣一起学习好了!

April 3, 2007

从手工创建MySQL数据库开始学习

    当初学习Oracle时, 曾花了很多时间翻来复去地练这一招, 现在学习MySQL我仍从这儿开始. 在虚拟机(VMWare)上装了一个Redhat AS 4 U1, 到MySQL网站上下载了rpm版本的安装文件(包括客户端和服务器), 版本是:

[root@RH4SRV1 MysqlDB]# rpm -qa | grep MySQL
MySQL-client-community-5.0.37-0.rhel4
MySQL-server-community-5.0.37-0.rhel4

    安装过程就不说了, 主要来练习一下手工建库的过程, 这样安装后, 是没有数据库的, 相应于Oracle安装时选择了不创建数据库这一选项. 首先要准备一下数据文件的目录, 并将这些目录的所有者都改为mysql:mysql, 我使用的目录结构如下:

/MysqlDB/data
/MysqlDB/InnoDB
/MysqlDB/InnoDB/log

    然后连接到mysql用户, 创建一个参数文件/MysqlDB/my.ini, 包括如下几个参数:

[mysqld]
port            = 3306
socket          = /tmp/mysql.sock

datadir=/MysqlDB/data

default-table-type=innodb
innodb_data_home_dir = /MysqlDB/InnoDB/
innodb_data_file_path = mysql_01.dbf:20M
innodb_log_group_home_dir = /MysqlDB/InnoDB/
innodb_log_arch_dir = /MysqlDB/InnoDB/log/
set-variable = innodb_buffer_pool_size=20M
set-variable = innodb_additional_mem_pool_size=2M
set-variable = innodb_log_file_size=5M
set-variable = innodb_log_buffer_size=3M
innodb_flush_log_at_trx_commit=1

    接下来就要来创建数据字典(mysql数据库)了, 用mysql_install_db这个角本, 建完后在到/MysqlDB/data/mysql目录下去看一下有没有mysql表文件生成, 如果没有则在RHAS 4上面可能要跑一下"/usr/sbin/setenforce Permissive"命令, 据初步查阅有关资料, 这应当是一个Bug.

mysql_install_db --defaults-file=/MysqlDB/my.ini

    接下来就可以启动mysql了, 使用mysqld_safe命令:

mysql$ mysqld_safe --defaults-file=/MysqlDB/my.ini
Starting mysqld daemon with databases from /MysqlDB/data

    再开一个会话, 用MySQL客户端去连接一下看看?

阅读全文

InnoDB存贮引挚的一些重要设置选项

1, innodb_buffer_pool_size

    用于缓冲表及其索引的内存区大小, 象Oracle中的DB_CACHE_SIZE, 这个比较容易理解.

2, innodb_log_file_size

    每个日志文件的大小, Oracle在这个默认值上, 不同的版本变化很多. 真实的应用中, 从20M到2G都有人用, 自已选吧. 我现在并没有看到什么Checkpoint的概念, 不知道大小对于MySQL有多大的影响?

3, innodb_log_buffer_size

    相当于Oracle中的LOG_BUFFER参数, 不过MySQL每秒种都会将日志缓冲区的内容写入日志文件, 因此不用设多大.

4, innodb_flush_logs_at_trx_commit

    这个参数用于控制在用户发出提交(Commit命令)时, MySQL如何处理日志缓冲中的内容. 在默认情况下, MySQL会每秒种将日志文件强行刷新到磁盘, 由于日志文件还受操作系统文件缓冲的控制, 因此在写时就可以分为两步了, 第一步是写入日志文件, 写到文件缓冲就算成功, 第二步将日志文件刷到磁盘, 真正写入磁盘. 这个值有三个值可以选:

0 : 用户提交时不做动作, 由MySQL每秒种写入日志文件并和磁盘同步.
1 : 提交时写日志文件, 并将日志文件和磁盘同步, Oracle的默认值.
2 : 提交时写日志文件, 但和磁盘的同步交给MySQL来每秒种进行.

5, innodb_fast_shutdown

    这个我不是很明白, 什么是Full Purge? 什么是Insert Buffer Merge? 为0时要做这两个操作, 为1时不做这两个操作, 为2时只将Log文件写入磁盘.

6, innodb_max_dirty_pages_pct

    dirty buffer最多能占的比率, 象Oracle中的某些参来控制checkpoint的频率, 默认值为90%也太高了吧?

7, innodb_thread_concurrency

    设为CPU+Physical Disk的总数, 默认值为8, 估计改不改影响不会很大.

April 4, 2007

MySQL每个Session所需要的内存情况

1, PGA

    在Oracle中每个会话都会有PGA, MySQL中的会话也是如此. 主要包括三部份: (a), 堆栈区, 由THREAD_STACK变量来决定; (b), 接收缓冲(Receive Buffer/Connection Buffer), 由NET_BUFFER_LENGTH参数决定; (c), 发送缓冲(Send Buffer/Result Buffer), 同接收缓冲区同样大小. 当在执行SQL语时, 会将SQL语句的文本复制一份, 如果你的SQL写得很长, 这部份也不可以小看的哦! 当进程或线程不再需要时, 则这些内存区域会释放.

2, IO Buffer

    IO读取缓冲, 顺序读时由参数READ_BUFFER_SIZE控制大小, 而随机读时由READ_RND_BUFFER_SIZE参数来决定, 在InnoDB下据说是没用的, 因为InnoDB本身就缓冲机制, 但是在读取临时文件时是否有效呢? 象Oracle中有专门的SORT_MULTIBLOCK_READ_COUNT参数.

3, Sort Buffer

    象Oracle中的SORT_AREA_SIZE一样, MySQL也有参数SORT_BUFFER_SIZE来将数据放到内存来进行排序, 比较容易理解. 有一个问题是, 当排序操作执行完后, 这些内存是立刻释放呢? 还是要到会话结束呢?

4, Join Buffer

    我到现在还不明白这一块内存是怎么用的? 当一个表没有索引可以用时, MySQL用这一块内存区进行Fast Full Join, 每两个表之间的Full Join都会使用一块这个区域, 如果更复杂的SQL包括很多个表, 有可能要使用多个Join Buffer, 这下我更晕了, 理论上(按照Oracle的)最多两个就够了吧, 因为Join只能在两个表间进行. 另外MySQL中所有的内存中的表都以Hash方式组织, 因此好象都是Oracle的Hash Join了?

5, BLOB Buffer

    当我们去扫描一个有BLOB列的表时, 会要配一个和返回记录中最大的BLOB大小一样的缓冲区. 这个有点不爽了, 如果BLOB中有两G的数据呢? 这一块如何释放呢? SQL执行完了就释放?

    以上只是我在看书时的猜测, 请大家扔砖吧!

April 5, 2007

MySQL数据库如何进行排序(Sort)操作?

    参考原始文档后, 自已总结一下, 有不对的地方请指正. 在MySQL中进行排序有两种算法, 以4.1版本为分水岭, 在此之前排序时的数据只包括ORDER BY中的列和一个记录的指针(Sort A), 在4.1之后多了一种改进的方法, 排序的数据中可以包括SELECT中的列和ORDER BY中的列(Sort B)

    Sort A中最主要的坏处是需要进行二次扫表, 第一次是将ORDER BY的列及记录指针读到SORT Buffer中, 然后排序, 如果要排序的数据很多, 不能在内存中完成, 则可能会用到临时表(tmpdir)空间. 排完序后再根据记录指针将记录读取到READ RND Buffer中, 这一步可能会很慢, 因为这里进行的读取大都是随机读, 而不是顺序读.

    Sort B中在第一次扫描表时将SELECT中的列和ORDER BY的列读到SORT Buffer中, 然后排序, 如果要排序的数据很多, 不能在内存中完成, 则可能会用到临时表(tmpdir)空间. 排完序后, 就不需要进行二次读表了, 因为所有的列都已经在第一次中读出来了. 可以想象, 如果SELECT中的字段很多, 记录很长, 那么一个Sort Buffer中存放的记录数就少了, 对于同样数量的记录, 就需要进行更多次的排序了, 有可能引起效率的降底.

    在MySQL中max_length_for_sort_data变量用于控制何时采用Sort A, 何时采用Sort B, 当SELECT中的列和ORDER BY中的列的长度超过这个设置时采用Sort A, 而在这个以内时采用Sort B. 但依据Oracle上的经验, 如果这个SQL最后要返回大量记录, 那么应当选用Sort B, 我们可以在会话级更改设置, 如果返回的记录很少, 那么可以优先采用Sort A, 因为随机读取的成本实在是比较高的.

    这些Buffer都会在SQL运行结束时自动释放. 还有一个问题时, 如果排序中用到了临时文件, 读取时是不是受到Read Buffer Size的控制?

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