1. 安装Apahce, PHP, Mysql, 以及php连接mysql库组件。
  yum -y install httpd php mysql mysql-server php-mysql
  
  2. 配置开机启动服务
  /sbin/chkconfig httpd on [设置apache服务器httpd服务开机启动]
  /sbin/chkconfig --add mysqld [在服务清单中添加mysql服务]
  /sbin/chkconfig mysqld on [设置mysql服务开机启动]
  
  /sbin/service httpd start [启动httpd服务,与开机启动无关]
  /sbin/service mysqld start [启动mysql服务,与开机无关]
  
  3.设置mysql数据库root帐号密码。
  mysqladmin -u root password 'newpassword' [引号内填密码]
  
  4. 让mysql数据库更安全
  mysql -u root -p [此时会要求你输入刚刚设置的密码,输入后回车即可]
  
  mysql> DROP DATABASE test; [删除test数据库]
  mysql> DELETE FROM mysql.user WHERE user = ''; [删除匿名帐户]
  mysql> FLUSH PRIVILEGES; [重载权限]
  
  5. 按照以上的安装方式, 配置出来的默认站点目录为/var/www/html/新建一个php脚本:
   phpinfo();
  ?>
  
  6. 新建一个数据库,添加一个数据库用户,设置用户权限。写个php脚本测试一下数据库连接吧。
  mysql> CREATE DATABASE my_db;
  mysql> GRANT ALL PRIVILEGES ON my_db.* TO 'user'@'localhost' IDENTIFIED BY 'password';
  
  
  
  //安装apache扩展
  yum -y install httpd-manual mod_ssl mod_perl mod_auth_mysql
  //安装php的扩展
  yum install php-gd
  yum -y install php-gd php-xml php-mbstring php-ldap php-pear php-xmlrpc
  //安装mysql扩展
  yum -y install mysql-connector-odbc mysql-devel libdbi-dbd-mysql
MySQL 大企业级应用可行性分析
http://www.dbanotes.net/database/mysql_comment.html
http://www.dbanotes.net/database/mysql_comment_2.html
http://www.dbanotes.net/database/mysql_comment_3.html
http://syre.blogbus.com/logs/23587704.html



一个mysql命令行客户端的一个小技巧

在mysql命令行客户端操作的时候,有时候一个语句的结果一长~~~~串,然后就没得看了,还会把之前的东西全冲掉。

mysql的命令行客户端有这么一个功能,可以选择查询结果的page方式。比如用\P less,就会用less来显示查询结果,就可以上下滚动翻页了。同样的,也可以用more或者其他什么东西,甚至可以用自己的脚本来做一些处理。如果想换回标准的,直接\P就可以了。\P是page的简写,所以喜欢更清晰的也可以用page。

另一个技巧知道的人多一些

在语句最后用\G代替;就会让查询结果垂直输出,对于有很多列的结果比如explain,会清晰一些。

本程序提供了一个需要权限才能访问的地址:http://gf.kaixin.com/home.do,而登陆接口是:http://login.kaixin.com/Login.do,通过post传递参数,达到访问需要权限才能访问的功能,模拟了浏览器Netscape的标准头,程序代码如下:


<?php

  Error_reporting(E_ALL);
    function vlogin($url,$request)
    {
      $cookie_jar = tempnam('./tmp','cookie');//在当前目录下生成一个随机文件名的临时文件
      $ch = curl_init(); //初始化curl模块
      curl_setopt($ch,CURLOPT_URL,$url);//登录页地址
      curl_setopt($ch, CURLOPT_POST, 1);//post方式提交
      curl_setopt($ch, CURLOPT_POSTFIELDS, $request);//要提交的内容
      //把返回$cookie_jar来的cookie信息保存在$cookie_jar文件中
      curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);
      //设定返回的数据是否自动显示
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      //设定是否显示头信息
      curl_setopt($ch, CURLOPT_HEADER, false);
      //设定是否输出页面内容
      curl_setopt($ch, CURLOPT_NOBODY, false);
      curl_exec ($ch);
      curl_close($ch); //get data after login      
      return $cookie_jar;
   }
  
  //登录成功后通过cookies获取页面内容
    function get_content_by_cookie($url,$cookie_jar)
    {
        $ch2 = curl_init();      
        curl_setopt($ch2, CURLOPT_URL, $url);
        curl_setopt($ch2, CURLOPT_HEADER, false);
        curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch2, CURLOPT_COOKIEFILE, $cookie_jar);
        $orders=curl_exec($ch2);      
        curl_close($ch2);
        return $orders;
    }

function clear_cookie($cookie_tmp_name)
  {
        @unlink($cookie_tmp_name);
    }

  //使用的例子
    //$list_url='要抓取的帖子地址';
    $list_url='http://gf.kaixin.com/home.do';//教父的主键
    //$login_url='登录地址';
    $login_url='http://login.kaixin.com/Login.do';
    $post_data='email=xdy108@126.com&login_type=1000&origURL=http://www.kaixin.com/SysHome.do&password=001002';
    $cookie_file=vlogin($login_url,$post_data);    //模拟登陆
    var_dump($cookie_file);
    $tmp_curl=get_content_by_cookie($list_url,$cookie_file);//这里获得帖子内容
    var_dump($tmp_curl);
  clear_cookie($cookie_file);//删除cookies临时文件  
?>
1、复制进程
Mysql的复制(replication)是一个异步的复制,从一个Mysql instace(称之为Master)复制到另一个Mysql instance(称之Slave)。实现整个复制操作主要由三个进程完成的,其中两个进程在Slave(Sql进程和IO进程),另外一个进程在 Master(IO进程)上。

要实施复制,首先必须打开Master端的binary log(bin-log)功能,否则无法实现。因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。
复制的基本过程如下:
1)、Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
2)、Master接收到来自Slave的IO进程的请求后,通过负责复制的IO进程根据请求信息读取制定日志指定位置之后的日志信息,返回给Slave 的IO进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置;
3)、Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪 个位置开始往后的日志内容,请发给我”;
4)、Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。
阅读全文
有一个表 tbl1 的结构如下:
CREATE TABLE `tbl1` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` char(20) NOT NULL default '',
  PRIMARY KEY  (`id`),
  KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

该表里已经存在了200万条记录.

现在, 需要把 tbl1 中的所有记录全部导到另一个完全相同的表 tbl2 中去.
1. 如果采用以下传统的方式, 则执行时间为: 98.01s


mysql>INSERT INTO tbl2 SELECT * FROM tbl1;

Query OK, 2000000 row affected (1 min 38.01 sec)
Records: 2000000  Duplicates: 0  Warnings: 0

2. 如果是用以下SQL语句, 则执行时间为: 80.85s (36.30 + 44.55)


mysql>ALTER TABLE tbl2 DISABLE KEYS;
Query OK, 0 rows affected (0.00 sec)



mysql>INSERT INTO tbl2 SELECT * FROM tbl1;
Query OK, 2000000 row affected (36.30 sec)
Records: 2000000  Duplicates: 0  Warnings: 0



mysql>ALTER TABLE tbl2 ENABLE KEYS;
Query OK, 0 rows affected (44.55 sec)
从上面的测试结果来看, 在大批量导入时先禁用索引, 在完全导入后, 再开启索引, 一次性完成重建索引的效率会相对高很多, 经过反复几次测试, 感觉后者基本能比前者快 1.2 倍左右. 这也就是 LOAD DATAL INFILE 相对较快的原因之一.

有些人以为搞嵌入式就是随便找本书看看,在电脑上编几个程序就完事。非也,其实嵌入式的门槛是比较高的。具体如下:  

  1、您得有一定数量的Money。

    (1)、开发板贵

    (2)、培训费更贵

    (3)、开发平台是贵得不能再贵。(除非您只是想玩玩而已)

  2、需要学习的东西多。(1)、window环境编程;(2)、Linux环境编程;(3)、单片机

  3、最后也是最重要的一点,你得有坚韧不拔之志和一颗平常之心。

   (1)、自信 坚强 积极 勤快 (注:好的自信是自觉的!)

   (2)、成功其实就是成为最好的您自己       

  嵌入式门槛虽然较高,但也跟其他事物一样,并不是牢不可破。只要我们用心去对待,东雪终将化去,春风定会吹来。具体步骤如下:

  1、《C语言》第二版 谭浩强 ; 《C程序设计语言》第二版 徐宝文译 机戒工业出版社

  你能区分开指针数组和数组指针吗?你知道函数指针吗?

  你能区分开定义一个变量时系统给它分配的空间与用malloc()函数给一个变量分配的空间有什么不一样吗?

  2、《数据结构》C语言版  黄国愉、叶乃青编  清华大学出版社

  你能合上书本,用C语言实现书中的单链表、双链表数据结构吗?

  3、《实用C++程序设计》第二板 中国电力出版社 Steve_Oualline著

  此阶段主要是学习其面向对象的编程思想,加深对C语言和数据结构的理解。

  4、学习单片机,最好能找个前辈带一带。

   你能用51单片机做出一样实际的东西吗?即使它再简单!

   要注意加深对中断的理解。

  5、学习ARM单片机。

   (1)、细读《ARM微控制器基础与实战》周立功编写 (注:即使你不用书中的开发板)

   (2)、细读相关芯片的原版英文文档。如:arm920TE.pdf  S3C2410_1.2.pdf

  6、学习uCOS!!操作系统。

   (1)、细读《嵌入式实时操作系统uC/OS-!!》第二版 召贝贝译

    你能把uCOS!!移植到自己的平台上吗?

   (2)、能编写在uCOS!!操作系统环境下运行的针对具体硬件的驱动程序

  7、熟悉Linux环境,学习Linux环境编程,学习交叉编程

   (1)、细读《linux命令大全.pdf》

   (2)、细读《GNU Make 使用手册(中译版).pdf》

   (3)、学习创建交叉编程环境.

  8、学习Linux操作系统。     

   (1)、《UNIX环境高级编程》

   (2)、细读“joyfire 笔记”,可在“www.qianrushi.com”网站的好书下载栏目获取

      (3)、细读《linux内核完全注释》

   (4)、细读《understanding the linux kernel 2》

   (5)、利用源代码阅读利器工具"Source Insight"进行真正的linux内核原码刨析

   (6)、最后进行内核移植,并能编写在linux操作系统环境下运行的针对具体硬件的驱动程序

  9、学习Linux设备驱动编写。可参考《Linux设备驱动程序》

 10、复习C++,学习用QT进行图形界面编程

   (1)、细读《QT编程宝典》

   (2)、学会通过查看QT电子文档进行QT GUI实地编程

   (3)、学习交叉编程.(其实就是把命令qmake变为tmake)

 11、当然,你也可学习一下PCB的制作和设计一个自己的CPU(即软壳)

  至此,你已学完嵌入式的整流程!但谨记:一个有思想的人才真是一个力量无边的人;有容乃大,能予方强!
      由于本人手机是s60的系统,喜欢没事的时候记几个英文单词,但是在记忆09年研究生入学单词发现读取一个9M的word文档时候出现死机等症状,于是本人将将其化为26个英文字母来排序,分开为26个word文件,方便大家放到手机上阅读记忆,希望大家能够学习劝学篇中:
积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。是故无冥冥之志者,无昭昭之明。无惛惛之事者,无赫赫之功。行衢道者不至,事两君者不容。目不能两视而明,耳 不能两听而聪。螣蛇无足而飞,梧鼠五技而穷。诗曰:“尸鸠在桑,其子七兮。淑人君子,其仪一兮。其仪一兮,心如结兮。”故君子 结于一也。
的精神,日积月累,慢慢学习,不断进取,当然也包括本人在内了,不用谢我,我只是为了自己,方便了大家罢了!

下载地址:http://www.xiangdong.org/english/words.zip


早就听说lighttpd加PHP的FAST-CGI方式性能不错,抽时间装了下.只是完成了环境的安装,还没具体看性能什么的!
以下是我装lighttpd+PHP(FAST-CGI)+mysql的,如有问题,请给我评论.


一、先安装mysql
安装mysql,你可以安装源码包,也可以用编译好的!直接解压拷贝也行.我用的是直接拷贝编译好的!
1.编译源码包
./configure  --prefix=/data2/ali --enable-assembler --enable-thread-safe-client --without-debug
make
make install
2.用编译好的压缩包!直接解压拷贝
tar zxf mysql-standard-5.0.27-linux-i686-glibc23.tar.gz
cd mysql-standard-5.0.27-linux-i686-glibc23
cp -rf mysql-standard-5.0.27-linux-i686-glibc23 /usr/local/mysql

//以下是为了启动多个端口
mkdir -p /data2/ali/mysql3308
mkdir -p /data2/ali/mysql3309
./scripts/mysql_install_db --ldata=/data2/ali/mysql3308
cp support-files/my-medium.cnf /data2/ali/mysql3308/my.cnf
vi /data2/ali/mysql3308/my.cnf
修改内容如下:
#
[mysqld]
datadir         = /data2/ali/mysql3308/
port            = 3308
socket          = /tmp/mysql-3308.sock
#

cp /data2/ali/mysql3308/ /data2/ali/mysql3309/
vi /data2/ali/mysql3309/my.cnf
修改内容如下:
#
[mysqld]
datadir         = /data2/ali/mysql3309/
port            = 3309
socket          = /tmp/mysql-3309.sock
#
启动mysql
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data2/ali/mysql3308/my.cnf  --user=root &
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data2/ali/mysql3309/my.cnf  --user=root &

检查mysql是否启动成功。
ps -ax|grep mysql
20835 pts/3    S      0:00 /bin/sh ./mysqld_safe --defaults-file=/data2/ali/mysql3308/my.cnf --user=root
20862 pts/3    Sl     0:00 /usr/local/mysql/bin/mysqld --defaults-file=/data2/ali/mysql3308/my.cnf --basedir=/usr/local/mysql --datadir=/data2/ali/mysql3308/ --user=root --pid-file=/data2/ali/mysql3308//XD_Blog_Web_132_42.pid --skip-external-locking --port=3308 --socket=/tmp/mysql-3308.sock
20872 pts/3    S      0:00 /bin/sh ./mysqld_safe --defaults-file=/data2/ali/mysql3309/my.cnf --user=root
20903 pts/3    Sl     0:00 /usr/local/mysql/bin/mysqld --defaults-file=/data2/ali/mysql3309/my.cnf --basedir=/usr/local/mysql --datadir=/data2/ali/mysql3309/ --user=root --pid-file=/data2/ali/mysql3309//XD_Blog_Web_132_42.pid --skip-external-locking --port=3309 --socket=/tmp/mysql-3309.sock

连接mysql
mysql -S /tmp/mysql-3108.sock



二、接着安装php
tar zxf php-5.2.4.tar.gz
cd php-5.2.4
./configure \
    --prefix=/usr/local/php-fcgi \
    --enable-fastcgi \
    --enable-force-cgi-redirect \
    --without-iconv \
    --enable-mbstring \
    --with-mysql=/usr/local/mysql
make
make install

复制参数文件到目标目录:
cp php.ini-dist /usr/local/php-fcgi/lib/php.ini

检查fast-cgi是否安装成功可以运行如下命令
/usr/local/php-fcgi/bin/php-cgi -v
显示如下信息,内容里包含“PHP 5.2.4 (cgi-fcgi)"表示支持fast-cgi了
PHP 5.2.4 (cgi-fcgi) (built: Oct 28 2007 20:08:41)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies


三、最后安装lighttpd
1.安装配置lighttpd

1.1 首先创建运行lighttpd的用户和组

# groupadd lighttpd
# useradd -g lighttpd -s /sbin/nologin -d /dev/null lighttpd

1.2 开始安装lighttpd

# wget http://www.lighttpd.net/download/lighttpd-1.4.8.tar.gz
# tar -zxvf lighttpd-1.4.8.tar.gz
# cd lighttpd-1.4.8
# ./configure --prefix=/usr/local/lighttpd

# make
# make install

# mkdir /usr/local/lighttpd/conf
# mkdir /usr/local/lighttpd/log

# mv ./doc/lighttpd.conf /usr/local/lighttpd/conf/
# cp ./doc/rc.lighttpd.redhat /etc/init.d/lighttpd



vi conf/lighttpd.conf
将 #”mod_fastcgi”, 的#去掉
server.modules              = (
                               "mod_rewrite",
                               "mod_redirect",
#                               "mod_alias",
                                "mod_access",
#                               "mod_cml",
#                               "mod_trigger_b4_dl",
#                               "mod_auth",
#                               "mod_status",
#                               "mod_setenv",
                               "mod_fastcgi",

找到fastcgi的定义

#### fastcgi module
## read fastcgi.txt for more info
## for PHP don't forget to set cgi.fix_pathinfo = 1 in the php.ini
fastcgi.server             = ( ".php" =>
                               ( "localhost" =>
                                 (
                                   "socket" => "/var/run/lighttpd/php-fastcgi.socket",
                                   "bin-path" => "/usr/local/php-fcgi/bin/php-cgi"
                                 )
                               )
                            )

一开始我把配置写"bin-path" => "/usr/local/php-fcgi/bin/php"这样,发现报错,后来改了下以上的配置,发现OK了!
启动lighttpd命令是这样的:
/usr/local/lighttpd/sbin/lighttpd -f conf/lighttpd.conf



最后可以在程序目录下建个test.php,检查一下是否正常!
我在测试机上装了libevent和memcached,在启动memcached时会报找到不到libevent,建了个软链接"ln -s /usr/local/lib/libevent-1.2a.so.1 /usr/lib/"就OK了!


libevent-1.2a.tar.gz
memcached-1.1.13.tar.gz

ln -s /usr/local/lib/libevent-1.2a.so.1 /usr/lib/



装完后测试时命令行连接的方式是:

所有命令分为3种类型
存储命令(有3项:’set’、’add’、’repalce’)指示服务器储存一些由键值标识的数据。客户端发送一行命令,后面跟着数据区块;然后,客户端等待接收服务器回传的命令行,指示成功与否。
取回命令(只有一项:’get’)指示服务器返回与所给键值相符合的数据(一个请求中右一个或多个键值)。客户端发送一行命令,包括所有请求的键值;服务器每找到一项内容,都会发送回客户端一行关于这项内容的信息,紧跟着是对应的数据区块;直到服务器以一行“END”回应命令结束。
状态 命令"stats" 被用于查询服务器的运行状态和其他内部数据。有两种格式。不带参数的:

例子:
telnet 127.0.0.1 11211
Trying 127.0.0.1...
set kk 0 0 3
122
STORED



以下是我安装时看的文章


Linux下缓存服务器的应用

作者:tonyvicky
来自:LinuxSir.Org
摘要:由于数据库存储的数据量越来越大,查询速度也就变的越来越慢,因此就有了缓存服务器应用的必要,本文是介绍Memcached的安装以及简单的使用。

本文只介绍memcached的PHP的API,想查看其他关于Memcached的API文档案,请访问 http://www.danga.com/memcached/

目录
一、环境需求
二、下载相关软件
三、安装和配置
1、安装Memcached
2、安装memcache PHP模块
3、测试脚本

四、关于本文


++++++++++++++++++++++++++++++++++++++++
正文
++++++++++++++++++++++++++++++++++++++++

一、环境需求
安装Memcached需要libevent库的支持,所以请在安装Memcached之前检查有没有安装libevent。测试环境还需要PHP的支持,本文假设PHP已经安装到/usr/local/php目录下,也就是在编译PHP的时候使用perfix参数指定目录(--prefix=/usr /local/php)

二、下载相关软件

Memcached下载地址:http://www.danga.com/memcached/
memcache PHP模块下载地址: http://pecl.php.net/package/memcache 推荐使用1.5版
libevent 下载地址: http://www.monkey.org/~provos/libevent/

本文不再讲述如何安装libevent

三、安装和配置

1、安装Memcached
root@tonyvicky:# tar vxzf memcached-1.1.12.tar.gz
root@tonyvicky:# cd memcached-1.1.12
root@tonyvicky:# ./configure --prefix=/usr/local/memcached
root@tonyvicky:# make
root@tonyvicky:# make install

安装完之后要启动服务
root@tonyvicky:# cd /usr/local/memcached/bin
root@tonyvicky:# ./memcached -d -m 50 -p 11211 -u root

参数说明 -m 指定使用多少兆的缓存空间;-p 指定要监听的端口; -u 指定以哪个用户来运行

2、安装memcache PHP模块
root@tonyvicky:# tar vxzf memcache-1.5.tgz
root@tonyvicky:# cd memcache-1.5
root@tonyvicky:# /usr/local/php/bin/phpize
root@tonyvicky:# ./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config --with-zlib-dir
root@tonyvicky:# make
root@tonyvicky:# make install

安装完后会有类似这样的提示:
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20050922/

把这个记住,然后修改php.ini,把
extension_dir = "./"

修改为
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20050922/"

并添加一行
extension=memcache.so

3、测试脚本

自己写一个PHP程序测试一下吧
$memcache = new Memcache; //创建一个memcache对象
$memcache->connect('localhost', 11211) or die ("Could not connect"); //连接Memcached服务器
$memcache->set('key', 'test'); //设置一个变量到内存中,名称是key 值是test
$get_value = $memcache->get('key'); //从内存中取出key的值
echo $get_value;
?>
/usr/bin/mysqld_safe   --defaults-file=/etc/my.cnf   --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --socket=/var/lib/mysql/mysql.sock &

./bin/mysqld_safe --defaults-file=./my.cnf --default-character-set=utf8

load data from master


先是配置启动一个默认的3306,然后复制一个my.cnf到另外一个目录里面,比如:data2,然后再修改一下:

[mysqld]
port            = 3309
socket          = /tmp/mysql_3309.sock

[client]
#password       = your_password
port            = 3309      
socket          = /tmp/mysql_3309.sock


mysql -S /tmp/mysql_3309.sock  就登入了。。。



启动多个实例:

/usr/local/mysql/bin/mysqld_safe --defaults-file=/usr/local/mysql/data2/my.cnf --pid-file=/usr/local/mysql/data2/mysqld_3307.pid  --log-error=/usr/local/mysql/data2/mysqld_3307.log.erro
以上容易导致:Can't create/write to file '/usr/local/mysql/data2/mysqld_3307.pid' 是由于:/usr/local/mysql/data2/目录权限是root不是mysql用户导致!
为此:
/usr/local/mysql/bin/mysqld_safe --defaults-file=/usr/local/mysql/data2/my.cnf --pid-file=/tmp/mysqld_3307.pid --log-error=/usr/local/mysql/data2/mysqld_3307.log.erro --user=mysql                      
这句就ok了,为此,我们chown -R mysql /usr/local/mysql/data2/  后上面也就ok了。。。
如有不懂请参考:http://blog.csdn.net/cracker_love/archive/2007/04/23/1576586.aspx
                        http://www.cnblogs.com/adforce/archive/2012/03/15/2399468.html
我用的是VMware版本是 5.5.3,host机器运行的是windows Xp professional 。

1、安装VMware workstation

2、安装guest系统,这里我安装的Red Hat Linux9,安装过程中确保网络连接选择的是NAT方式,当然可以在安装完后进行修改。

3、到windows XP 中,查看所有的网络连接,你应该发现除了原有的网卡之外,又多了Vmnet1和Vmnet8。vmnet1是hostonly的接口,而Vmnet8是就是我们要使用的NAT的网络接口。

4、在win主机上用ipconfig查看VMnet8的IP地址,
一般是192.168.X.1/255.255.255.0,
此时VMnet8的设置应该是自动获取IP,现在改成静态IP,并把此IP直接填入VMnet8里,不设网关。

5、同时在VM网络设置里的NAT项中查看VMnet8,一般是192.168.X.2/255.255.255.0
这个地址就是VMnet8,NAT的网关

6、现在在LINUX下把网卡IP设置成和VMnet8一个网段的IP(192.168.X.Z/255.255.255.0)

7、网关设置成刚才查看的那个IP192.168.X.2即可

8、DNS和你host主机的一样就可以。

9、设置完成后,重新启动linux的网络服务。

10、测试一下,
ping 网关:ping 192.168.X.2
ping DNS:ping 你的DNS。

如果能ping通就ok了

<?php
$string = 'cup';
$name = 'coffee';
$str = 'This is a $string with my $name in it.';
echo $str. "\n";
eval("\$str = \"$str\";");
echo $str. "\n";
?>



<?php
class myclass {
   function say_hello()
   {
       echo "Hello!\n";
   }
}

$classname = "myclass";

call_user_func(array($classname, 'say_hello'));
?>
实践如下:
1.配置主库my.cnf
[mysqld]  
log-bin=mysql-testsyn-bin --主库二进制日志文件名的前缀  
binlog-do-db=wb      --要同步的数据库  
server-id = 1             --serverid和辅库不同即可  
修改为:




主库加帐号,10.51.178.1** 内网IP可以来访问,创建用户slave.拥有replication slave权限:
grant replication slave on *.* to "slave"@"10.51.178.1**" identified by "123FFFCCC6" with grant option;  
用PHPMyadmin看也就是这两项权限: GRANT  REPLICATION SLAVE ,不需要插入修改删除啥的,最小化。
查看主库状态:
show master status;  
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000007 |  1606516 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+


配置辅库:
server-id = 2  
master-host = 10.51.180.**  
master-user = slave    
master-password = 123FFFCCC6  
master-port = 3306  
master-connect-retry = 5  --重试间隔时间  
replicate-do-db = wb    --同步db


启动mysql ,查看辅库状态:
show slave status;

说明:
Slave_IO_Running:连接到主库,并读取主库的日志到本地,生成本地日志文件
Slave_SQL_Running:读取本地日志文件,并执行日志里的sql


把主库上的数据dump到辅库上
主库:10.51.180.**:
mysqldump --opt --master-data -uroot -p123FFFCCC6 > /home/mahaibo/dump-testsyn &

注意参数:--master-data

辅库:10.51.178.1**
先建立库:create database wb;

导入前停止同步:
stop slave    
mysql -uroot -p123FFFCCC6 wb < /home/mahaibo/dump-testsyn    
start slave;  
必须先停止stop slave,然后才能导入
操作指南如下:
【=====================================
首先,关闭辅助库同步:
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

其次,从主机上导出sql并在辅机上执行和主机一样。

第三,清空主机上所有位置: reset master;
mysql> reset master;
Query OK, 0 rows affected (0.01 sec)

mysql> show master status\G;
*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 120
     Binlog_Do_DB: wb
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
辅机:
mysql> show slave status\G;
Read_Master_Log_Pos: 4

第四,清空辅库的bin-log位置:
mysql> reset slave;
Query OK, 0 rows affected (0.00 sec)

第五,打开辅库的slave同步线程:
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

第六,看到辅库和主库的Read_Master_Log_Pos= 120 ,如下:
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.51.180.220
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 120
==============================================】
4.在主库10.51.180.**上在wb.user表里插入一条数据:
insert into users (username,password) values ('test1','test1');

辅库上的users表里也相应的有了数据。

5.查看主库二进制日志文件内容:
show binlog events;



注意:
1.主辅库同步主要是通过二进制日志来实现同步的。
2.在启动辅库的时候必须先把数据同步,并删除日志目录下的:master.info文件。因为master.info记录了上次要连接主库的信息,如果不删除,即使my.cnf里进行了修改,也不起作用。因为读取的还是master.info文件里的信息。



MySQL运行时间长了之后,二进制日志会占用大量硬盘空间,清楚这些日志的命令如下:
show binary logs;
purge master logs before now();
mysql> purge master logs before now();
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000004 |     46653 |
+------------------+-----------+
1 row in set (0.00 sec)


reset master 将删除日志索引文件中记录的所有binlog文件,创建一个新的日志文件 起始值从000001 开始,然而purge binary log 命令并不会修改记录binlog的顺序的数值
上面还有一个没有清掉,得用这个就彻底清了,120:
mysql> reset master;
Query OK, 0 rows affected (0.00 sec)
mysql> reset master;
Query OK, 0 rows affected (0.01 sec)

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       120 |
+------------------+-----------+
1 row in set (0.00 sec)

mysql> RESET SLAVE
    -> ;
Query OK, 0 rows affected (0.00 sec)

http://www.shangxueba.com/jingyan/1638441.html


————————————参考实践自如下链接————————————————————
http://blog.csdn.net/ljx0305/article/details/4371655
http://wenku.baidu.com/link?url=rK2b1ofBZnxgoQF5rW0JcjwU7Cn-WT6AuH_E29sOkgKDkEYeJQ6E5XGgt-NzAaYxuPzx25I_qJCB9Xe3F6QKTtILymCkKzFrEUi9rY_xtyO


新版本不支持master-host参数,[ERROR] /usr/local/mysql/bin/mysqld: unknown variable 'master-host=10.51.180.2**':
------解决方案--------------------
Mysql版本从5.1.7以后开始就不支持“master-host”类似的参数
在从库上执行如下命令;
change master to master_host='masterIP', master_user='slave', master_password='slvaePASS';
slave start;
切记:
此处是masterIP地址,不是slave地址,而登陆账号为slave账号密码
------解决方案--------------------
master-host=192.168.8.111
master-user=backup
master-password=backup
master-port=3306
master-connect-retry=60


这些参数 mysql5.5已经废弃了  

必须在slave上用change master to 来设置slave



server-id = 2
#master-host = 10.51.180.**  新版本废弃
#master-user = slave
#master-password = 123FFFCCC6
#master-port = 3306
#master-connect-retry = 5
replicate-do-db = wb

mysql> change master to master_host='10.51.180.**', master_user='slave', master_password='123FFFCCC6';
Query OK, 0 rows affected, 2 warnings (0.02 sec)


mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Connecting to master
                  Master_Host: 10.51.180.**
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File:
          Read_Master_Log_Pos: 4
               Relay_Log_File: mysql-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File:
             Slave_IO_Running: Connecting
            Slave_SQL_Running: Yes
              Replicate_Do_DB: wb
           .......
说明成功了,因为参数已经是Connecting和yes了:
Slave_IO_Running:连接到主库,并读取主库的日志到本地,生成本地日志文件
Slave_SQL_Running:读取本地日志文件,并执行日志里的sql

但此时还没有库,只是连接成功,于是,得从主库拉出数据,并停止辅库:
mysql> show databases; //slave没有wb表
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

照猫画虎建一个wb库:
mysql> show create database mysql;
+----------+----------------------------------------------------------------+
| Database | Create Database                                                |
+----------+----------------------------------------------------------------+
| mysql    | CREATE DATABASE `mysql` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> CREATE DATABASE `wb` /*!40100 DEFAULT CHARACTER SET utf8 */ ;  
Query OK, 1 row affected (0.00 sec)

从master下的mysql里导出表及数据sql:
10.51.180.**
mysqldump -uroot -p wb > wb2slave.09.24.sql
scp上步导出的sql到slave目录里source导入:
scp root@10.51.180.**:/root/wb2slave.09.24.sql  ./
导入到刚才在slave建立的wb 库里:
mysql -uroot -p
mysql> use wb;
mysql> stop slave
Database changed
mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> source /root/wb2slave.09.24.sql
Query OK, 0 rows affected (0.00 sec)
导入完成后,启动slave:
mysql>  start slave;
Query OK, 0 rows affected (0.00 sec)

清掉刚才导入之前的,主库里的bin-log:
mysql> PURGE MASTER LOGS BEFORE '2015-09-24 17:05:00';        
Query OK, 0 rows affected, 1 warning (0.00 sec)


mysql>  show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000008 |      1222 |
+------------------+-----------+
mysql-bin.000007没有了,mysql-bin.000008一个了。
其它清理方法如下:
清除3天前的 binlog
PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY);
清指定文件的bin-log:
PURGE MASTER LOGS TO 'mysql-bin.000008';

清理MySQL的bin-log二进制日志
Posted by zuzhihui in mysql on 2011/11/27 with No Comments
MySQL运行时间长了之后,二进制日志会占用大量硬盘空间,清楚这些日志的命令如下:
show binary logs;
purge master logs before now();


重置mysql主从同步(MySQL Reset Master-Slave Replication):
reset master;
mysql>  show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       120 |
+------------------+-----------+
http://www.shangxueba.com/jingyan/1638441.html

发现内外网不一致,加个外网:
Last_IO_Error: error connecting to master 'slave@10.51.180.220:3306' - retry-time: 60  retries: 1
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

grant replication slave on *.* to "slave"@"10.51.180.*" identified by "123FFFCCC6" with grant option
grant replication slave on *.* to "slave"@"101.200.1.*" identified by "123FFFCCC6" with grant option
flush privileges;

一台服务器有内网ip和外网ip,如何通过iptables禁止访问本机的外网ip的某个端口,比如3306端口?

iptables防火墙 只允许某IP访问某端口、访问特定网站:
+++++++++++++++++主库:eth0 : 10.51.180.220++++++++++++++++++++++++++
让辅库IP10.51.178.1** 能访问到主的3306端口:
iptables -I INPUT -s 10.51.178.1** -p tcp --dport 3306 -j ACCEPT
写到开机启动里头 vi /etc/rc.local:
#开机就放开内部Mysql端口:让辅库内网IP能访问到该机器的3306备份端口
/usr/sbin/iptables -I INPUT -s 10.51.178.1** -p tcp --dport 3306 -j ACCEPT
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

http://www.sunzhenghua.com/msyql-grant-user-master-slave-replication-copy
参考:http://www.myexception.cn/mysql/387629.html
========================================================================

防火墙问题引起,Telnet 时出现,No route to host:
telnet :No route to host
telnet 10.51.180.** 3306
Trying 10.51.180.**...
telnet: connect to address 10.51.180.**: No route to host
[root@iZ258cfosv4Z ~]# telnet 10.51.180.** 3306
http://blog.sina.com.cn/s/blog_5022501501010pin.html

10.51.180.**       //在主库上关闭掉iptables即可。
/bin/systemctl stop  iptables.service

10.51.178.128
telnet 10.51.180.** 3306
Trying 10.51.180.**...
Connected to 10.51.180.**.
Escape character is '^]'.
测试连接:
mysql -uroot -h10.51.180.** -p
再测试这个,OK也就行了:
mysql -uslave -h10.51.180.** -p


show slave status\G;
Master_UUID: fef2f186-1fc5-11e5-9cb7-00163e0003e7
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

change master to master_host='10.51.180.**', master_user='slave', master_password='123FFFCCC6';

Slave_IO_State: Waiting for master to send event
Master_Host: 10.51.180.**
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Read_Master_Log_Pos: 9687
Relay_Log_Pos: 820
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB: wb


_________________________________________________________________________________
Could not find first log file name in binary log index file'的解决办法
数据库主从出错:
Slave_IO_Running:  No 一方面原因是因为网络通信的问题也有可能是日志读取错误的问题。以下是日志出错问题的解决方案:

Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'

解决办法:
从机器停止slave
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)


mysql> reset master;
Query OK, 0 rows affected (0.00 sec)
mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       120 |
+------------------+-----------+

到master机器登陆mysql:
记录master的bin的位置,mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      120 | wb           |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

刷新日志:mysql> flush logs;
因为刷新日志file的位置会+1,即File变成为:mysqld-bin.000011

马上到slave执行
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=120;                
Query OK, 0 rows affected (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status\G;
mysql>  show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.51.180.**
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 120
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: wb
             Master_Server_Id: 1
                  Master_UUID: fef2f186-1fc5-11e5-9cb7-00163e0003e7
             Master_Info_File: /data/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind:

正常了。
diff 用过吗?老大让我a.log b.log 比较出相同,后将相同从a.log中去掉,然后显示出剩下的放入到文件x.log

==> a.log <==
1
3
2

==> b.log <==
5
4
2
3


sort a.log >> aa.log
sort b.log >> bb.log
diff aa.log bb.log |grep "<" >> x.log
//还好老大给出了这个比较方法。。

[code]diff aa.log bb.log 结果如何记忆?  <:表示a独特有的,>:表示b独特有的!


aa.log中有1在bb.log中没有,于是<1,同样:bb.log有4,5在aa.log中没有,于是:>4 >5  :
[~]# diff aa.log bb.log                  
1d0
< 1
3a3,4
> 4
> 5
[/code]
假设文件有5列,我想按照第3列排序应该怎么使用sort命令呢?
sort -k 3 yourfile.txt


我现在写shell统计遇到一个问题, 比如一个文件a里是
1,02
2,05
这种格式
另一个文件b里是
3,02
5,05
这种格式,我想让如果a b 逗号后面(02或05)的相同的话, 则把 b的 逗号前面的(3或5) 放在 a 对应的后面
怎么做啊?
awk -F, 'NR==FNR{a[$2]=$1}NR>FNR{print $0","a[$2]}' fileb filea





我们再来个示例:
文件:a.txt b.txt

cat a.txt
[root@vm19 diff]# cat a.txt
asp
php
jsp
csp
zzz

cat b.txt
[root@vm19 diff]# cat b.txt
jsp
php
asp
csp
java
c
python

排序a.txt b.txt
sort b.txt >>bbb.txt
sort a.txt >>aaa.txt

[root@vm19 diff]# cat aaa.txt
asp
csp
jsp
php
zzz



[root@vm19 diff]# cat bbb.txt
asp
c
csp
java
jsp
php
python
diff一下:

[root@vm19 diff]# diff bbb.txt aaa.txt
2d1
< c
4d2
< java
7c5
< python
---
> zzz



找出bbb.txt和aaa.txt中bbb.txt和aaa.txt中多余的程序语言
diff bbb.txt aaa.txt|grep -r "<"
[root@vm19 diff]# diff bbb.txt aaa.txt|grep -r "<"
< c
< java
< python
找出bbb.txt和aaa.txt中bbb.txt和aaa.txt比较中bbb.txt中没有的
[root@vm19 diff]# diff bbb.txt aaa.txt|grep -r ">"
> zzz


一个语句完成也行:但是注意取出空行空格:
diff <(sort -n a.txt) <(sort -n b.txt)

=============================================
PS技巧:
如何过滤掉 “< ”

diff a.txt b.txt |grep "<"|awk -F"< " '{print $2}' > ddd.txt


务必参考:http://www.jackxiang.com/post/3484/
1. 准备

创建一个测试表:


mysql> CREATE TABLE `t` (
`d1` int(10) unsigned NOT NULL default '0',
`d2` timestamp NOT NULL default CURRENT_TIMESTAMP,
`d3` datetime NOT NULL,
KEY `d2` (`d2`),
KEY `d1` (`d1`),
KEY `d3` (`d3`)
);


然后创建一个存储过程填充数据:



mysql> DELIMITER //
CREATE PROCEDURE INS_T()
BEGIN
SET @i=1;
WHILE 0<1
DO
SET @i=@i+1;
INSERT INTO t VALUES (1199116800+@i, FROM_UNIXTIME(1199116800+@i), FROM_UNIXTIME(1199116800+@i));
END WHILE;
END;//
DELIMITER ;


run stroe process:

call INS_T();
时间戳 1199116800 表示 2008-01-01 这个时间点。然后运行存储过程,大概填充几十万条记录后,中止执行,因为上面的存储过程是个死循环,所以需要人工中止(ctrl+c)。
删除存储过程:
DROP PROCEDURE test.INS_T;


查看存储过程:


SHOW CREATE PROCEDURE  test.INS_T;


来看看到底有多少条记录了,以及索引情况:

mysql> select count(*) from t;
+----------+
| count(*) |
+----------+
|   924707 |
+----------+
mysql> analyze table t;
+--------+---------+----------+-----------------------------+
| Table  | Op      | Msg_type | Msg_text                    |
+--------+---------+----------+-----------------------------+
| test.t | analyze | status   | Table is already up to date |
+--------+---------+----------+-----------------------------+
mysql> show index from t;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| t     |          1 | d2       |            1 | d2          | A         |      924707 |     NULL | NULL   |      | BTREE      |         |
| t     |          1 | d1       |            1 | d1          | A         |      924707 |     NULL | NULL   |      | BTREE      |         |
| t     |          1 | d3       |            1 | d3          | A         |      924707 |     NULL | NULL   |      | BTREE      |         |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+



2. 对比

2.1 只检索一条记录


mysql> explain select * from t where d1 = 1199579155;
+----+-------------+-------+------+---------------+------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------+
|  1 | SIMPLE      | t     | ref  | d1            | d1   | 4       | const |    1 |       |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------+
mysql> explain select * from t where d2 = '2008-01-06 08:25:55';
+----+-------------+-------+------+---------------+------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------+
|  1 | SIMPLE      | t     | ref  | d2            | d2   | 4       | const |    1 |       |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------+
mysql> explain select * from t where d3 = '2008-01-06 08:25:55';
+----+-------------+-------+------+---------------+------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------+
|  1 | SIMPLE      | t     | ref  | d3            | d3   | 8       | const |    1 |       |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------+


2.2 范围检索(我发现当大于时候根本没有用到索引,小于用到了)
mysql> explain select * from t where d1 <= 1199894400;
+----+-------------+-------+-------+---------------+------+---------+------+--------+-------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows   | Extra       |
+----+-------------+-------+-------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | t     | range | d1            | d1   | 4       | NULL | 121961 | Using where |
+----+-------------+-------+-------+---------------+------+---------+------+--------+-------------+
mysql> explain select * from t where d2 <= from_unixtime(1199894400);
+----+-------------+-------+-------+---------------+------+---------+------+--------+-------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows   | Extra       |
+----+-------------+-------+-------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | t     | range | d2            | d2   | 4       | NULL | 121961 | Using where |
+----+-------------+-------+-------+---------------+------+---------+------+--------+-------------+
mysql> explain select * from t where d3 <= from_unixtime(1199894400);
+----+-------------+-------+-------+---------------+------+---------+------+--------+-------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows   | Extra       |
+----+-------------+-------+-------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | t     | range | d3            | d3   | 8       | NULL | 120625 | Using where |
+----+-------------+-------+-------+---------------+------+---------+------+--------+-------------+

小贴士:
explain select * from t where d2 <= from_unixtime(1199894400);   key_len :为4
explain select * from t where d3 <= from_unixtime(1199894400);   key_len :为8
效率体现出来了吧?呵呵!



话外音:当大于时候根本没有用到索引,如下:(和下面in和=关于索引的情况类似,但这个> 和< 的情况我还是不太清楚,呵呵)

mysql>  explain select * from t where d1 >= 1199894400;
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows    | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
|  1 | SIMPLE      | t     | ALL  | d1            | NULL | NULL    | NULL | 9871898 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+


mysql> explain select * from t where d2 >= from_unixtime(1199894400);
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows    | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
|  1 | SIMPLE      | t     | ALL  | d2            | NULL | NULL    | NULL | 9871898 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+

mysql> explain select * from t where d3 >= from_unixtime(1199894400);
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows    | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
|  1 | SIMPLE      | t     | ALL  | d3            | NULL | NULL    | NULL | 9871898 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+





小结:从上面的2次对比中可以看到,对 d1 或 d2 字段检索时的索引长度都是 4,因为 TIMESTAMP 实际上是 4字节 的 INT 值。因此,实际应用中,基本上完全可以采用 TIMESTAMP 来代替另外2种类型了,并且 TIMESTAMP 还能支持自动更新成当前最新时间,何乐而不为呢?




in 和 = 在索引上的区别,建表:

CREATE TABLE `mytest` (
  `id` int(11) NOT NULL auto_increment,
  `uid` int(11) NOT NULL,
  `rstatus` int(11) default NULL,
  PRIMARY KEY  (`id`),
  KEY `uid` (`uid`)
) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=utf8



EXPLAIN SELECT *
FROM `mytest`
FORCE INDEX ( uid )
WHERE uid =1
AND rstatus =1


发现用上了uid的索引,但这个in语句:

explain SELECT * FROM `mytest`  WHERE uid IN ( 1,2,7) and rstatus =1

没有用上uid索引。

为此:认为要建立联合索引?是的,不光是要建立联合索引,而且和顺序有关,如建立:
alter table mytest add index tt(uid,rstatus);
也没有用,这样后运行:

explain SELECT * FROM `mytest`  WHERE uid IN ( 1,2,7) and rstatus =1

也没有用到我们想要的tt索引,但是,我们将联合索引换个顺序:
alter table mytest add index tt(rstatus,uid);

执行:
explain SELECT * FROM `mytest`  WHERE uid IN ( 1,2,7) and rstatus =1
,就用到了我们的联合索引了!
如下说明:
1.in 和 = 在索引机制上的不同!
2.in 的mysql索引和顺序有关!
最后:我去掉联合索引,加入了强制用uid的索引:
但:
SELECT * FROM `mytest` force index(uid) WHERE uid IN ( 1,2,7) and rstatus =1
也就ok了!




来源:
http://imysql.cn/2008_07_17_timestamp_vs_int_and_datetime
修正了存储过程的代码!



附录:
  

描述

CREATE PROCEDURE
  

建立一个存放在MySQL数据库的表格的存储过程。

CREATE FUNCTION
  

建立一个用户自定义的函数,尤其是返回数据的存储过程。

ALTER PROCEDURE
  

更改用CREATE PROCEDURE 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。.

ALTER FUNCTION
  

更改用CREATE FUNCTION 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。.

DROP PROCEDURE
  

从MySQL的表格中删除一个或多个存储过程。

DROP FUNCTION
  

从MySQL的表格中删除一个或多个存储函数。

SHOW CREATE PROCEDURE
  

返回使用CREATE PROCEDURE 建立的预先指定的存储过程的文本。这一声明是SQL:2003规范的一个MySQL扩展。

SHOW CREATE FUNCTION
  

返回使用CREATE  FUNCTION建立的预先指定的存储过程的文本。这一声明是SQL:2003规范的一个MySQL扩展。

SHOW PROCEDURE STATUS
  

返回一个预先指定的存储过程的特性,包括名称、类型、建立者、建立日期、以及更改日期。这一声明是SQL:2003规范的一个MySQL扩展。

SHOW FUNCTION STATUS
  

返回一个预先指定的存储函数的特性,包括名称、类型、建立者、建立日期、以及更改日期。这一声明是SQL:2003规范的一个MySQL扩展。

CALL
  

调用一个使用CREATE PROCEDURE建立的预先指定的存储过程。

BEGIN ... END
  

包含一组执行的多声明。

DECLARE
  

用于指定当地变量、环境、处理器,以及指针。

SET
  

用于更改当地和全局服务器变量的值。

SELECT ... INTO
  

用于存储显示变量的纵列。

OPEN
  

用于打开一个指针。

FETCH
  

使用特定指针来获得下一列。

CLOSE
  

用于关闭和打开指针。

IF
  

一个An if-then-else-end if 声明。

CASE ... WHEN
  

一个 case声明的结构

LOOP
  

一个简单的循环结构;可以使用LEAVE 语句来退出。

LEAVE
  

用于退出IF,CASE,LOOP,REPEAT以及WHILE 语句。

ITERATE
  

用于重新开始循环。

REPEAT
  

在结束时测试的循环。

WHILE
  

在开始时测试的循环。

RETURNS
  

返回一个存储过程的值。




















1.Linux/FreeBSD下用C语言开发PHP的so扩展模块例解:
http://www.toplee.com/blog/56.html
2.扩展实战 ------ 获得ip的来源地址:
http://my.huhoo.net/archives/2008/02/php_ip.html#4_3_configure
3.Linux/FreeBSD下用C语言开发PHP的so扩展模块例解:(估计和1重复)
http://info.codepub.com/2008/08/info-21341-4.html
4.在linux下编写php扩展模块三(函数参数和返回值)
http://mydraft.cn/posts/22  //这篇文章对与参数的传入比较详细,不错!
5.php扩展开发学习笔记 3
http://syre.blogbus.com/logs/13318038.html


分页: 234/272 第一页 上页 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 下页 最后页 [ 显示模式: 摘要 | 列表 ]