新安装MySQL常用命令整理

## CMD
* mysql -uroot -p –default-character-set=utf8 exam <C:/exam.sql
* mysql -uroot -p exam < C:/exam.sql * mysqldump -uroot -p dbname >db.sql

从mysql中导出数据库mysite:
在终端运行:mysqldump -h localhost -u root -p mysite > /home/wade/文档/test.sql
其中localhost是服务器名字 mysite是数据库名字,test.sql为输出的sql文件

将test.sql 导入到mysql数据库:
在终端运行:mysql -h localhost -u root -p mysite < /test.sql –default-character-set=utf8
其中:–default-character-set=utf8 解决中文乱码

新版本导入数据库步骤:
create database qiaomoxuan default charset ‘utf8’;
use qiaomoxuan
source d:/qiaomoxuan0731.sql

为WAMP3.0.6中的mysql设置密码
use mysql
update MySQL.user set authentication_string=password(‘root’) where user=’root’;
flush privileges;

修改配置文件,设置默认引擎为InnoDB:
default-storage-engine=InnoDB

创建表示例:
CREATE TABLE IF NOT EXISTS tp_user(
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL DEFAULT ”,
age TINYINT(1) NOT NULL DEFAULT 2,
create_time DATETIME NULL DEFAULT CURRENT_TIMESTAMP()
)DEFAULT CHARSET=UTF8;

临时设置客户端默认字符集:
SET NAMES utf8;

查看创建表的语句:
SHOW CREATE TABLE tp_user;

MySQL表锁、行锁的小实验

数据准备

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE DATABASE `test`;
use test;

CREATE TABLE `user1`(
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(30) NOT NULL DEFAULT '',
`age` INT NOT NULL DEFAULT 0
)ENGINE=InnoDB DEFAULT CHARSET=UTF8;

-- 测试数据
INSERT INTO user1 (name, age) VALUES
('a', 1),
('b', 2),
('c', 3),
('d', 4),
('e', 5);

开启事务机制,锁定一行

Select Code
1
2
3
4
5
-- 开启事务
begin;

-- 锁定一行
SELECT * FROM user1 WHERE name='a' AND age=1 for update;

说明:for update是锁表的操作。

行锁的特点:InnoDB存储引擎是通过索引上的索引项加锁来实现的,这就意味着:只有通过索引条件检索数据,InnoDB才会使用行级锁。否则,InnoDB将使用表锁。

锁定同一个表中的另外一行数据

Select Code
1
2
3
-- 打开另一个窗口执行上面的步骤
begin;
SELECT * FROM user1 WHERE name='b' AND age=2 for update;

结果:表被锁定,此操作无效。

下一步:给name这个字段添加索引,这样InnoDB将被执行行锁而不是表锁。

操作命令:

Select Code
1
2
-- 添加索引
ALTER TABLE user1 ADD INDEX index_name(name)

查看表索引

结论:
没有索引的情况下,会出现表锁;
InnoDB支持行锁,但是行锁需要有索引的支持,如果没有索引则是表锁
MyISAM只支持表锁,这也是为什么MySQL新版是默认使用InnoDB存储引擎。
InnoDB支持行锁定

PHP MemCache缓存加速的完整入门教程内容及实战案例

一、MemCache的基本概念
MemCache系统是通过客户端发送的命令(set/get)管理“内存中缓存”的数据。客户端在于MemCached服务器建立连接以后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符key,存取操作均通过这个key进行,保存到memcached中的对象实际上是放置在内存中的,而并不是保存在缓存文件中的,这也是为什么MemCached能够如此告诉快速的原因。

memcached工作原理

MemCache在WEB中的应用:

1、使用MemCache作为中间缓冲层减少数据库的压力
2、MemCache分布式的应用

二、MemCache的安装及管理
1、Linux下安装MemCache软件
省略…

2、Window下安装MemCache软件
下载MemCache二进制数据包;
解压后放在某个磁盘的分区下面:如D:\

执行安装命令:

D:\>memcached.exe -d install

安装memcached

通过计算机管理的“服务”中查看刚安装的memcached软件。

计算机管理的服务查看memcached

启动memcached服务器:

D:\>memcached.exe -d start

启动memcached服务器

停止memcached服务器的运行:

D:\>memcached.exe -d stop

3、memcached服务器的管理

一些常用的管理选项:

例如:memcached.exe -d -m 2048 -l localhost -p 11211

-d 以守护程序方式运行memcached
-m 2048 2GB内存
-l localhost 监听本机
端口 11211

memcached服务器的管理

三、使用Telnet作为memcached的客户端管理
1、连接memcached服务器

telnet localhost 11211

连接memcached服务器

2、基本的memcached客户端命令

stats:当前所有memcached服务器运行的状态信息
add:添加一个数据到服务器
set:替换一个已经存在的数据。如果数据不存在,则和add命令相同。
get:从服务器端提取指定的数据。
delete:删除指定的单个数据。清除所有的数据,可以使用flush_all指令。

3、数据管理指令

添加(add)、修改(set)

<命令><键><标记><有效期><数据长度>

键:key
标记:一个16位的无符号整型数据,用来设置服务器端和客户端的一些交互操作
有效期:0表示无限制,单位是秒

memcached 数据管理指令

删除(delete)和获取(get)

<命令><键>

memcached 删除数据管理指令

四、PHP的memcached管理接口
1、安装PHP中的MemCache应用程序扩展接口
安装文件后,在配置文件中加入“extension=php_memcache.dll”

2、PHP程序使用MemCache应用程序接口的方法实例

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
<?php
    //实例化得到memcache对象
    $mem = new Memcache();

    //连接memcached服务器
    $mem->connect('127.0.0.1',11211);

    //赋值
    $mem->set('name','jack',2,1000);

    //取值
    echo $mem->get('name');

结果输出:jack

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
	//得到memcache对象
	$mem = new Memcache();

	//连接
	$mem->connect('127.0.0.1', 11211);

	$list = array('name'=>'jack', 'age'=>18);

	//赋值   存进去是什么样子,读取出来就是什么样
	$mem->set('list', $list);

	//取值
	$res = $mem->get('list');

	echo '<pre>';
	    print_r($res);
	echo '</pre>';

输出结果如下:

从memcached服务器中获取数据

分布式memcached服务器

Select Code
1
2
3
4
//添加多台服务器
$mem->addServer('192.168.12.6',11211);
$mem->addServer('192.168.12.251',11211);
$mem->addServer('192.168.12.25',11211);

五、MemCache的实例应用
1、从数据库读取用户表的PHP代码

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
$mem = new Memcache();
$mem->connect('127.0.0.1', 11211);

$sql = "select id, username, password, addtime from shop_user";

$fileName = md5($sql);

// 从memcached服务器获取值
$userlist = $mem->get($fileName);

if (empty($userlist)){

    $link = mysqli_connect('127.0.0.1','root', '', 'ishop');
    mysqli_set_charset($link,'utf8');

    sleep(3);
    $res = mysqli_query($link, $sql);

    if ($res) {
        while ($row = mysqli_fetch_assoc($res)) {
            $userlist[] = $row;
        }
    }

    // bool Memcache::set ( string $key , mixed $var [, int $flag [, int $expire ]] )
    // 向memcached中设置值,设置失效时间是10s
    $mem->set($fileName, $userlist, 2, 10);
}

/*
key 
要设置值的key。 
var 
要存储的值,字符串和数值直接存储,其他类型序列化后存储。 
flag 
使用 MEMCACHE_COMPRESSED 指定对值进行压缩(使用zlib)。 
expire 
当前写入缓存的数据的失效时间。
*/

?>

2、HTML的数据展示代码

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<table width="600" border="1" align="center">
<caption><h2>用户列表</h2></caption>
<tr>
    <th>ID</th>
    <th>UserName</th>
    <th>Password</th>
    <th>AddTime</th>
</tr>
<?php foreach($userlist as $v): ?>
<tr>
    <td><?php echo $v['id']; ?></td>
    <td><?php echo $v['username']; ?></td>
    <td><?php echo $v['password']; ?></td>
    <td><?php echo $v['addtime']; ?></td>
</tr>
<?php endforeach; ?>
</table>

六、代码解释:

1、第一次访问时,$userlist数据为空,因此会读取数据库操作,查询的结果会同时存储到memcached中,$mem->set($fileName, $userlist, 2, 10); 并且设置了失效的时间为10s。

2、$userlist只要没有失效,那么访问该页面,就会通过$userlist = $mem->get($fileName);来获取存储在memcached中的查询结果,而不直接访问数据库。这样读取的速度就会很快。

3、当缓存失效后,再读取数据库中的最新数据。

memcached_案例展示

SQL的CONCAT()函数实例:无限级分类排序

SQL语句:
SELECT * FROM `shop_catalog` order by CONCAT(`path`, `id`)

Select Code
1
2
3
4
5
6
7
8
9
10
/*
  遍历分类
  */
  $sql = "SELECT * FROM `shop_catalog` order by CONCAT(`path`, `id`)";
  $res = mysqli_query($conn, $sql);
  while ($row=mysqli_fetch_assoc($res)) {
    $list_cata[] = $row;
    $list_catapid[] = $row['pid'];
  }
  mysqli_free_result($res);

查询结果如图:
concat_01

分类列表下拉效果:

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<table border="0" width="80%">
<tr>
  <td width="100" align="right">所属分类</td>
  <td><select name="cata_id" class="form-control" style="width:200px;">
  <option value="0">---选择所属的分类---</option>
  <?php 
    foreach ($list_cata as $key => $val) {
      $path = $val['path'];
      $num = substr_count($path, ',');
      $str_blank = str_repeat('+    ', $num-1);
      $value_id = " value='".$val['id']."'";
      $disabled = NULL;
      if (in_array($val['id'], array_unique($list_catapid))) {
        $value_id = null;
        $disabled = " disabled class='disabled'";
      }
      echo "<option{$value_id}{$disabled}>{$str_blank}{$val['name']}</option>";
    }
  ?>
  </select></td>
</tr>

concat_02