自从 2006年09月 ↓

十一

终于到来了.
总算可以喘口气,周围的同事朋友们回家的回家出游的出游,我也早早就买好了今天晚上去通州的火车票,还是站票,连卧铺都没有~~~~
祝各位看见的和没看见的以及看不见的节日快乐!吃好喝好玩好都是次要的,最主要的是要休息好.

flash action script中实现settimeout功能

经过一番google确定,AS中是没有类似settimeout这种方法的,实现时间延迟只能走曲线.主要有下面两种办法:
方法一:
stop();
var loadTime=getTimer();
this.onEnterFrame=function()
{
//设置停顿时间,单位毫秒
if((getTimer()-loadTime)>=1000)
{
play();
delete this.onEnterFrame;
}
}

方法二:
stop();
//设置停顿时间,单位毫秒
var loadTime=setInterval(playMC,1000);//隔1000毫秒执行一次.
function playMC()
{
play();
clearInterval(loadTime);//执行一次以后就给丫清了.
}

记此备忘.

关于MySQL的性能优化

什么是我们能和应该优化的

  • Hardware
  • OS / libraries
  • SQL server (setup and queries)
  • API
  • Application
  • 优化硬件

  • 如果你需要大表(>2G),你应该考虑使用64位硬件,像Alpha,Sparc或者IA64.由于MySQL使用大量内部的64位整型,64位的CPU将有更好的表现.
  • 对于大数据库,优化顺序通常是内存,硬盘,CPU.
  • 更多的内存可以通过把更多的索引页保留在内存中来提高索引更新的速度
  • 如果你不使用事务安全表或者有一个大硬盘并且想避免大文件检查,有一个UPS是个好办法,它能在断电的时候使系统正常关闭.
  • 对于数据库运行在专用的服务器上的系统来说,应该考虑1G的网络,传输延迟和吞吐量同样重要.
  • 优化磁盘

  • 有专用的磁盘来运行系统,程序以及临时文件.如果更改很频繁,把更新日志和事务日志放在专用的磁盘上.
  • 对于数据库磁盘来说短寻道时间很重要;对于大表你可以预估需要:log(row_count) / log(index_block_length/3
  • 2/(key_length + data_ptr_length))+1 次查找来找到一行.对于一个有500000行的表要索引(medium int)log(500,000)/log(1024/3
  • 2/(3+4)) +1 = 4 次.上面的索引将需要500,000
  • 7
  • 3/2 = 5.2M,在实际文件中,大部分数据块将被缓冲,因此大概只需要1-2次查找.
  • 对写入操作你将需要(像上面一样)4次查找请求,为了找到索引存放的地方,通常要2次查找来更新索引和写入行.
  • 对实在大的数据库,你的应用将基于你的磁盘查找的速度,当你获得更多数据的时候,它以NlogN的速度增长.
  • 把数据库和表拆分到不同的磁盘上.在MySQL里你可以使用符号连接来实现.
  • RAID0将提高读和写
  • RAID0+1能提供安全性和提高读的速度.写操作将稍慢.
  • 不要在磁盘上使用镜像或者RAID(除了RAID0)用来存放临时文件或者为了数据能够恢复.
  • 在Linux下,的磁盘上启动时使用hdparm -m16 -d1开启多重扇面同时读写能力,和DMA.这可以提高5-50%的响应.
  • 在Linux上,用async(默认)和noatime来mount磁盘.
  • 对一些特殊的应用,有可能希望用一个ram磁盘存放特殊的表,但是通常这个不需要的.
  • 优化OS

  • 不要swap;如果你有内存问题,多加一些RAM来代替或者配置你的系统用更少的内存
  • 不要使用NFS磁盘来存储数据(会遇到NFS锁的问题).
  • 为系统和SQL服务器提高开放文件的数量(添加ulimit -n #在safe_mysqld脚本里).
  • 为系统提高处理器和线程的数量.
  • 如果有相对比较少的大表,告诉文件系统不要把文件分散到不同的柱面上(Solaris).
  • 使用支持大文件的文件系统(Solaris).
  • 选择使用哪个系统;Reiserfs在Linux上打开,读和写非常快.文件检查只需要几秒.
  • 选择API

  • PERL
  • OS和数据库之间可移植的程序
    对快速的原型设计有好处
    应该使用DBI/DBD接口

  • PHP
  • 比PERL简单
    比PERL使用更少的资源,使它更容易在Web服务器上使用.
    能通过升级到PHP4来获得更快的速度

  • C
  • 到MYSQL天然的接口
    更快,更容易控制
    更底层,因此你要做的更多

  • C++
  • 更高的级别给你更多的时间来编写你的应用
    仍在开发中

  • ODBC
  • 运行在Windows和Unix上
    几乎在不同的SQL服务器上可移植
    慢,MyODBC,是一个简单的穿透驱动比天然接口慢19%.
    很多途径做同样的事;像很多ODBC驱动一样在不同的区域有不同的bug很难运行.
    问题重重;Microsoft经常更改接口.
    不稳定的未来(Microsoft在OLE上比ODBC花更多的精力).

  • JDBC
  • 理论上在OS和数据库之间可移植
    可以在web客户端上运行

  • Python+others
  • 可能很好,但是我们不使用他们.

    优化应用程序

  • 应该有人专注于解决问题
  • 写应用程序的时候应该决定什么是最重要的:
  • 速度
    OS间可移植
    SQL服务器间可移植

  • 使用持续连接
  • 在你的应用程序中使用缓存来减少SQL服务器的压力.
  • 不要在你的应用程序中查询不需要的列.
  • 不要使用SELECT * FROM table_name…
  • 检查你的程序的所有部分,但是把努力放在检查整个应用下面最坏可能”合理”的压力上.
  • 如果一下子做很多改变,使用LOCK TABLES;例如很多UPDATE或者DELETE在一起的时候.
  • 可移植的应用程序应该使用:

  • Perl DBI/DBD
  • ODBC
  • JDBC
  • Python(或者任何其他有全面的SQL接口的语言)
  • 你应该只使用在所有的目标SQL服务器上存在的或者可以轻易被其他构造模仿的SQL构造.
  • 写封装来为其他的OS/SQL服务器提供缺少的功能.
  • 如果你需要更快的速度,你应该:

  • 找到瓶颈(CPU,磁盘,内存,SQL服务器,OS,API,或者应用程序)并专心解决他们
  • 使用能给你带来更多速度/灵活性的扩展
  • 了解你的SQL服务器以便于你在遇到问题或者避免瓶颈的时候使用可能最快的SQL构造
  • 优化你的表结构和查询
  • 使用备份来获得更多的select速度
  • 如果连接到数据库的网速很慢,使用压缩的客户端/服务器协议.
  • 不要担心你的第一个版本不是完全可移植的,当你解决了难题,优化总是可以稍后进行

    优化MySQL

  • 选择编译程序合编译选项
  • 为你的系统找到做好的MySQL启动选项
  • 学习MySQL手册,读Paul DuBois的MySQL著作
  • 使用EXPLAIN SELECT, SHOW VARIABLES, SHOW STATUS 和 SHOW PROCESSLIST.
  • 学习查询优化器是如何工作的.
  • 优化你的表结构
  • 维护你的表(myisamchk, CHECK TABLE, OPTIMIZE TABLE).
  • 使用MySQL扩展获得更快的速度.
  • 写一个MySQL UDF函数如果你发现你在很多地方需要这样的函数
  • 如果你不是确实需要,不要在表一级或者列一级使用GRANT
  • 付费给MySQL客服来获得帮助,解决问题:)
  • 编译和安装MySQL

  • 为你的系统选择最好的编译程序,通常可以获得10-30%更好的性能
  • 在Linux/Intel上,用pgcc编译MySQL.但是,二进制文件将只能运行在Pentium CPU上.
  • 对特殊的平台,使用MySQL手册总推荐的优化选项
  • 通常对特别的CPU(像Sparc的Sun工作站)本地的编译器会比gcc提供个个你好的性能,但是不总是这样.
  • 只用你将要使用的字符集编译MySQL
  • 把mysqld编译成静止可执行(使用–with-mysqld-ldflags=-all-static)并使用strip sql/mysqld去掉最终可执行.
  • 注意由于MySQL不使用C++异常,编译MySQL时去掉异常支持将获得很大性能的提升.
  • 如果你的OS支持,那么使用本地线程.
  • 使用MySQL性能测试来测试最终的二进制文件.
  • 维护

  • 如果可能,偶而运行OPTIMIZE table .这对于经常更新的可变大小的行非常重要.
  • 偶而使用myisamchk -a来更新你的表中索引的分布状态;记住做这个之前关闭MySQL.
  • 如果有文件碎片,把所有文件拷贝到另外的磁盘,清理旧磁盘再把文件拷回来或许很有意义.
  • 如果有问题,用myisamchk 或者CHECK table来检查你的表
  • 用 mysqladmin -i10 processlist extended-status 监视MySQL状态
  • 用mysqladmin debug 来获得锁和性能的信息
  • 优化SQL
    把SQL用在它擅长的地方,用应用程序做其他事.用SQL服务器来做:

  • 通过where条件找到行
  • 联合表
  • GROUP BY
  • ORDER BY
  • DISTINCT
  • 不要用SQL服务器做:

  • 检查数据(像日期)
  • 作为计算器
  • Tips

  • 精明的使用索引
  • 索引对搜索有好处,但是对插入/更新索引所在列没好处
  • 保持数据符合第三范式,但是不要怕重复信息或者在需要更快速度的时候建立摘要表.
  • 用建立和查询大表的摘要表来代替在一个大表上进行多次GROUP BY操作.
  • UPDATE table set count=count+1 where key_column=constant非常快.
  • 对日志表,偶而从他们中生产摘要表可能比让摘要表一直存在要好.
  • INSERT的时候利用默认值的优点
  • 不同SQL服务器之间的不同速度
    Reading 2000000 rows by key: NT Linux
    mysql 367 249
    mysql_odbc 464
    db2_odbc 1206
    informix_odbc 121126
    ms-sql_odbc 1634
    oracle_odbc 20800
    solid_odbc 877
    sybase_odbc 17614

    Inserting (350768) rows: NT Linux
    mysql 381 206
    mysql_odbc 619
    db2_odbc 3460
    informix_odbc 2692
    ms-sql_odbc 4012
    oracle_odbc 11291
    solid_odbc 1801
    sybase_odbc 4802

    在上面的测试中,MySQL运行于8M的缓存,其他数据库运行在默认安装上.

    重要的MySQL启动选项
    back_log Change if you do a lot of new connections.
    thread_cache_size Change if you do a lot of new connections.
    key_buffer_size Pool for index pages; Can be made very big
    bdb_cache_size Record and key cache used by BDB tables.
    table_cache Change if you have many tables or simultaneous connections
    delay_key_write Set if you need to buffer all key writes
    log_slow_queries Find queries that takes a lot of time
    max_heap_table_size Used with GROUP BY
    sort_buffer Used with ORDER BY and GROUP BY
    myisam_sort_buffer_size Used with REPAIR TABLE
    join_buffer_size When doing a join without keys

    优化表

  • MySQL有丰富的类型.你应该为每一列选择最有效的类型
  • ANALYSE过程能帮助你找到一个表的最佳类型:SELECT * FROM table_name PROCEDURE ANALYSE()
  • 使用NOT NULL 将不保存空值.这对建立索引的列尤为重要.
  • 把你的表由ISAM类型改变为MyISAM类型
  • 如果可能,用固定表格式建立表.
  • 不会使用的时候不要建立索引
  • 记住MySQL可以在索引的前缀上进行搜索;如果你有INDEX (a,b),就不必在(a)上建立索引.
  • 在CHAR/VARCHAR列上建立索引的时候,用建立前缀索引来节省空间.CREATE TABLE table_name (hostname CHAR(255) not null, index(hostname(10)))
  • 为每个表选择最有效的类型
  • 不同表中的同样信息的列应该同样定义并且有同样的名字.
  • MySQL如何存储数据

  • 数据按目录存放
  • 表以文件的形式存放
  • 列以变长或者固定尺寸的格式存放.在BDB表中数据按页存放
  • 支持基于内存的表
  • 数据库和表可以从不同的磁盘上做符号连接
  • 在Windows上MySQL支持对数据库通过.sym文件做内部的符号连接
  • MySQL表类型

  • HEAP表;只存在于内存中的固定行尺寸表,用哈希索引
  • ISAM表;MySQL3.22中的老的B树表
  • MyISAM表;包括大量扩展的ISAM表的新版本:
  • 二进制可移植
    空值列上的索引
    动态尺寸列上比ISAM表更少的碎片
    支持大文件
    更好的索引压缩
    更好的关键字统计
    更好并且更快的auto_increment 处理

  • 从Sleepycat来的Berkeley DB (BDB):事务安全(通过BEGIN WORK / COMMIT | ROLLBACK).
  • MySQL行类型(有关ISAM/MyISAM表)

  • 如果每列都是固定长度的格式(没有VARCHAR,BLOB或者TEXT列)MySQL将建立固定尺寸的表格式,否则,表被建立成动态尺寸格式
  • 固定尺寸比动态尺寸格式格式更快也更安全
  • 动态尺寸格式的行通常占更少的空间但是如果表经常更新会一直产生碎片
  • 有时候为了提高主表的速度把所有的VARCHAR,BLOB和TEXT列转移到其他表中是值得的.
  • 用myisampack (ISAM中用pack_isam )可以建立一个只读的,打包的表.它最小的利用磁盘空间在慢磁盘时效果很好.打包的表最好用在不会更新的日志表上.
  • MySQL缓存(一旦分配,所有线程共享)

  • 关键字缓存:key_buffer_size,默认8M
  • 表缓存;table_cache,默认64
  • 线程缓存;thread_cache_size,默认0
  • 域名缓存;在编译时可以更改,默认128
  • 内存地址表;目前只用在压缩表上.
  • 注意MySQL没用行缓存,让OS来处理这个.

    MySQL缓冲变量(通过命令分配,不共享)

  • sort_buffer ; ORDER BY / GROUP BY
  • record_buffer ;扫描表
  • join_buffer_size :不通过关键字连接
  • myisam_sort_buffer_size :REPAIR TABLE
  • net_buffer_length ;用来读SQL语句和缓冲结果
  • tmp_table_size;临时结果的HEAP表尺寸
  • Continue reading →

    Sql Relay

    Sql Realy是SF上的一个项目,它实现了数据库连接池,同时它也可以实现负载均衡,按照文档的说法”In effect, SQL Relay is a very specialized Load Balancer”.
    连接池可以有效的减少连接带来的开销,因此Sql Relay和Mysql一起使用,似乎是个不错的主意.除了连接的开销,大量并发读写造成的锁表问题也是优化Mysql时要考虑的问题,我们在提高Mysql数据库应付大并发访问能力的时候,一个常见的方法是使用Master-Slave结构使读写分开,主写从读,从而避免大量读操作造成的锁表,必要时可以使用多个Slave服务器来分担压力,虽然Sql Relay可以作为一个load balancer,但是它并不能区分一个操作是读还是写,因此,我们可以用Sql Relay来专门对付那些Slave.
    Sql Relay可以在SF上下载,同时还需要Rudiments.

    安装过程:
    解压缩,首先安装Rudiments,非常简单,make;make install就搞定
    然后安装Sql Relay,注意本机上需要首先安装Mysql,因为Sql Relay在安装的时候需要Mysql的一些include和lib中的文件.
    在configure时指定Sql Relay和Mysql的安装路径:
    configure –prefix=/usr/local/sqlrelay –with-mysql-prefix=/usr/local/mysql/
    然后 make 和make install

    配置
    到etc目录中,cp sqlrelay.conf.example sqlrelay.conf
    Continue reading →

    《HighPerformanceMysql》

    一看名字你就知道这书是干嘛用的.
    内容包括index,query performance,server performance,replication,load balance等方面,怎么样,是不是听着都那么的诱惑?虽然是E文的,但是还是比较通俗易懂的,连我都差不多看的懂,你就知道多简单了,呵呵.
    电子版本的网上很多,我下载到的是chm版本的,其实我更喜欢看pdf版的,不知道哪位仁兄大姐赐给我一个半个.
    其实mysql在应付网站应用方面还是很强劲的,其最大的优点是省钱,第二大的优点是速度比较快.当然了,按照某位牛人的说法,不要指望某一个功能提升整个网站的性能,它必将成为瓶颈.
    牛人还说,不要用oracle.

    Wi-Fi

    在家用无线网卡上网,40Kbps,so too very的慢啊,想起了以前拨号的时候…
    有没有无线网卡的区别就是我能和我不能.

    solidot居然要关闭了

    我倒,一来就看到这个消息,着实非常的ft.
    solidot是我每天早上要看的网站之一,最近一直不太稳定,不是代码出问题,就是服务器扛不住,导致信息更新的也很慢,恶性循环.看来没有盈利模式和全职的工作人员,这样的网站真的很难坚持下去.
    确实非常的可惜.

    明天晚上回家

    大概下周一回来,期间停止更新,谢谢.