• 2009-05-21

    InnoDB和MyISAM

    InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。下面是已知的两者之间的差别,仅供参考。

    innodb
    InnoDB 给 MySQL 提供了具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs)。这些特性均提高了多用户并发操作的性能表现。在InnoDB表中不需要扩大锁定(lock escalation),因为 InnoDB 的列锁定(row level locks)适宜非常小的空间。InnoDB 是 MySQL 上第一个提供外键约束(FOREIGN KEY constraints)的表引擎。

    InnoDB 的设计目标是处理大容量数据库系统,它的 CPU 利用率是其它基于磁盘的关系数据库引擎所不能比的。在技术上,InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。 InnoDB 把数据和索引存放在表空间里,可能包含多个文件,这与其它的不一样,举例来说,在 MyISAM 中,表被存放在单独的文件中。InnoDB 表的大小只受限于操作系统的文件大小,一般为 2 GB。

    在 http://www.innodb.com/ 上可以找到 InnoDB 最新的信息。InnoDB 手册的最新版本总是被放置在那里,并且在那里可以得到 InnoDB 的商业许可(order commercial licenses)以及支持。

    InnoDB 现在(2001年十月)在一些大的需高性能的数据库站点上被使用。著名的 Internet 新闻站点 Slashdot.org 就是使用的 InnoDB。 Mytrix, Inc. 在 InnoDB 表上存储了超过 1 TB 的数据,而且另外的一个站点在 InnoDB 表上处理着平均每秒 800 次的插入/更新的负载。

    MyISAM
    MyISAM 是MySQL缺省存贮引擎 .

    每张MyISAM 桌被存放在盘在三个文件 。frm 文件存放表格定义。 数据文件是MYD (MYData) 。 索引文件是MYI (MYIndex) 引伸。

    以下是一些细节和具体实现的差别:

    1.InnoDB不支持FULLTEXT类型的索引。
    2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。
    3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
    4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
    5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

    另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

    任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。

    Tag:
  • 2009-05-14

    JS和CSS的一些小应用 - [JQuery]

    1.select对话框,选择对应value的内容,并显示在DIV里。

    <script>
    function showimage(arg){
      var dd = arg.indexOf('img:');
      var ff = arg.substring(dd+4);
      hehe.style.display='';
      susu.src= 'Dock.jpg';
    }
    function qudiao(){
      hehe.style.display='none';
    }
    </script>
    <style type="text/css">
    <!--
    #hehe {
        position:absolute;
        width:200px;
        height:115px;
        z-index:1;
        left: 66px;
        top: 21px;
    }
    -->
    </style>

    <div id="hehe" style="display:none">
    <img  id="susu" onmouseout="qudiao()" src="" width="500px"  height="100px" border="0" /></div>
    <select id="engraving_cy" style="width: 800px;" size="5" name="engraving_cy" onchange="showimage(this.options[selectedIndex].text)">
    <option value="950@p@140x77x3xpublic/upload/material/431a25f852f7b0ea79c9adc594785812.jpg@p@mm">dimg:public/upload/material/431a25f852f7b0ea79c9adc594785812.jpg</option>
    <option value="650@p@140x77x2xpublic/upload/material/431a25f852f7b0ea79c9adc594785812.jpg@p@mm">price:650;width:140;height:77;amount:2;unit:;img:public/upload/material/431a25f852f7b0ea79c9adc594785812.jpg</option>
    </select>

     

    2. 鼠标划过,变色!!!

    最简单的办法:

    <table width="200" border="1">
          <tr  onmouseover="this.bgColor='#666666'" onmouseout="this.bgColor='#FFFFFF'" >
              <td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
          </tr>
         <tr  onmouseover="this.bgColor='#666666'" onmouseout="this.bgColor='#FFFFFF'" >
              <td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
         </tr>
    </table>

    Tag:php JS
  • 2009-05-13

    Linux 下各种查找替换字符串的办法 - [linux]

    1、在vi中使用的查找替换方法
    利用 :s 命令可以实现字符串的替换。具体的用法包括:
    :s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1
    :s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1
    :.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
    :1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1
    :g/str1/s//str2/g 功能同上从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。

    2、在shell中使用find结合grep进行文件的替换
    # find ./ -exec grep 'str1' '{}' \; -exec sed -i.bak s/str1/str2/g '{}' \;
    上面命令可以在当前目录下(包括子目录)查找包含str1的文件,自动替换成str2,并且生成源文件的bak文件

    Tag:linux
  • 2009-05-03

    查看mysql的sleep进程,并且kill掉,可在后台运行 - [mysql]

    <?php
    define('MAX_SLEEP_TIME', 120);

    $hostname = "localhost";
    $username = "root";
    $password = "password";
     
    $connect = mysql_connect($hostname, $username, $password);
    $result = mysql_query("SHOW PROCESSLIST", $connect);
    while ($proc = mysql_fetch_assoc($result))
    {
        
    if ($proc["Command"] == "Sleep" && $proc["Time"] > MAX_SLEEP_TIME)
       {
            @
    mysql_query("KILL " . $proc["Id"], $connect);
        
    }
    }
    mysql_close($connect);
    ?>

    #bash# crontab:

    */2 * * * * php /usr/local/sbin/kill-mysql-sleep-proc.php
    Tag:linux Mysql