MYSQL中InnoDB和MyISAM的区别

InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。

MyIASM是IASM表的新版本,有如下扩展:

二进制层次的可移植性。
NULL列索引。
对变长行比ISAM表有更少的碎片。
支持大文件。
更好的索引压缩。
更好的键码统计分布。
更好和更快的auto_increment处理。

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

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的性能优势。

MySQL通过localhost无法连接数据库的解决

问题:一台服务器的PHP程序通过localhost地址无法连接数据库,但是如果设置为127.0.0.1则可以正常连接,连接其他数据库服务器也正常。MySQL的权限设置正确,且通过mysql命令行客户端可以正常连接数据库。

分析:这是典型的socket没有正确设置的情况。

连接MySQL数据库有两种方式:TCP/IP(一般理解的端口的那种)和Unix套接字(一般叫socket或者sock)。大部分情况下,可以用localhost代表本机127.0.0.1(注意:localhost(local)是不经网卡传输!这点很重要,它不受网络防火墙和网卡相关的的限制。127.0.0.1是通过网卡传输,依赖网卡,并受到网络防火墙和网卡相关的限制),但是在MySQL连接时,二者不可混用,而且MySQL中权限设置中localhost与127.0.0.1也是分开设置的。当设置为127.0.0.1时,系统通过TCP/IP方式连接数据库;当设置为localhost时,系统通过socket方式连接数据库。

解决:首先要看本机MySQL的socket套接字文件在哪里,查看命令是:

mysql --verbose --help | grep socket

输出结果显示套接字文件的位置,比如:这台服务器显示的是:

socket /var/run/mysqld/mysqld.sock

然后修改php的配置文件php.ini与之对应起来就好了。找到这两项:

mysql.default_socket =
mysqli.default_socket =


一般来说这一项都是空的,改成:

mysql.default_socket = /var/run/mysqld/mysqld.sock
mysqli.default_socket = /var/run/mysqld/mysqld.sock


这里应写上一步查询到的文件,根据你的情况设置。至此php配置就修改好了,如果是CLI(命令行)方式或者CGI方式的话,立即就生效,如果是FASTCGI方式,需要重启一下fastcgi进程。

YAF说明文档

Yaf - Yet Another Framework

Build Status
PHP framework written in c and built as a PHP extension.

Requirement

  • PHP 5.2 +

Install

Install Yaf

Yaf is an PECL extension, thus you can simply install it by:

$pecl install yaf

Compile Yaf in Linux

$/path/to/phpize
$./configure --with-php-config=/path/to/php-config
$make && make install

For windows

Yaf binary dlls could be found at http://code.google.com/p/yafphp/downloads/list

Document

Yaf manual could be found at: http://www.php.net/manual/en/book.yaf.php

IRC

efnet.org #php.yaf

For IDE

you could find a documented prototype script here: https://github.com/elad-yosifon/php-yaf-doc

Tutorial

layout

PHP 之 CURL学习(一)

  • 此文件为curl学习例子,参考http://www.chinaz.com/program/2010/0119/104346.shtmlPHP手册
  • libcurl 目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。
  • libcurl 同时也支持HTTPS认证、HTTP POST、HTTP PUT、FTP上传、HTTP基于表单的上传、代理、COOKIES和用户名+密码的验证

Example1

  • cURL的请求的基本步骤:
    1.初始化
    2.设置变量
    3.执行并获取结果
    4.释放cURL句柄
$ch = curl_init(); //1、初始化
curl_setopt($ch, CURLOPT_URL, 'http://www.baidu.com'); //2、设置选项、包括URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //CURLOPT_RETURNTRANSFER 将curl_exec()获取的信息以流文件形式返回,而不是直接输出
curl_setopt($ch, CURLOPT_HEADER, 1); //CURLOPT_HEADER 启用时会将头文件的信息作为数据流输出
$output = curl_exec($ch); //3、执行 curl_exec失败时返回flase,判断时应该用===
curl_close($ch); //4、释放句柄

Example2

  • 写两个简单的函数用curl来发送POST和GET请求
    curl_setopt_array() 为cURL传输回话批量设置选项
/**
*Send a POST request using cURL
*@param string $url to request
*@param array $post values to send
*@param array $options for url
*/
function curl_post($url, array $post = NULL, array $options = array()) {
$defaults = array(
CURLOPT_POST => 1,
CURLOPT_HEADER => 0,
CURLOPT_URL => $url,
CURLOPT_FRESH_CONNECT => 1,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FORBID_REUSE => 1,
CURLOPT_TIMEOUT => 4,
CURLOPT_POSTFIELDS => http_build_query($post)
);

$ch = curl_init();
curl_setopt_array($ch, $options + $defaults);//数组相加 根据key将在后一个数组而不再前一个数组中的item加入第一个数组中(任意一个数组不是数组导致Faltal error)
if(false === $result = curl_exec($ch)) {
trigger_error(curl_error($ch));
}
curl_close($ch);
return $result;
}

/**
*Send a GET request using cURL
*@param string $url to request
*@param array $get values to send
*@param array $options for cURL
*/
function curl_get($url, array $get = NULL, array $options = array()) {
$defaults = array(
CURLOPT_URL => $url.($get ? (strpos($url, '?') === false ? '?' : '&').http_build_query($get) : ''),
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_TIMEOUT => 4
);

$ch = curl_init();
curl_setopt_array($ch, $options + $defaults);
if(false === $result = curl_exec($ch)) {
trigger_error(curl_error($ch));
}
curl_close($ch);
return $result;
}

Example3

  • 通过cURL上传文件
$url = 'http://localhost/log.php';
$post_data = array(
'name' => 'myname',
'file' => '@d:\test.jpg' //上传的本地文件要加@符号
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1); //可有可无
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
if(false === $result = curl_exec($ch)) {
trigger_error(curl_error($ch));
}
curl_close($ch);

MySQL中索引的限制

在使用索引的同时,还应该了解MySQL 中索引存在的限制,以便在索引应用中尽可能地避开限制所带来的问题。下面列出了目前 MySQL 中与索引使用相关的限制。

1) MyISAM存储引擎索引键长度的总和不能超过1000字节;

2) BLOB和TEXT类型的列只能创建前缀索引;

3) MySQL 目前不支持函数索引;

4) 使用不等于(!= 或者 <>)的时候,MySQL 无法使用索引;

5) 过滤字段使用了函数运算(如abs(column))后,MySQL无法使用索引;

6) Join 语句中 Join 条件字段类型不一致的时候,MySQL 无法使用索引;

7) 使用LIKE操作的时候如果条件以通配符开始(如’%key…’)时,MySQL无法使用索引;

8) 使用非等值查询的时候,MySQL 无法使用 Hash 索引。

在使用索引的时候,须要注意上面的这些限制,尤其是要注意无法使用索引的情况,因为这很容易造成极大的性能隐患。