分类存档: MySQL

Swoole异步MySQL查询

Swoole支持异步MySQL客户端,可以在不阻塞主服务器进程的情况下执行数据库查询。

这对于需要频繁访问数据库的应用来说非常有用。

$server = new Swoole\Server("127.0.0.1", 9501);
 
$server->on('start', function ($server) {
 
    echo "Swoole server is started at http://127.0.0.1:9501\n";
 
});
 
$server->on('receive', function ($server, $fd, $from_id, $data) {
 
    // 异步查询数据库
 
    $db = new Swoole\Coroutine\MySQL();
 
    $server->defer(function () use ($db) {
 
        $db->close();
 
    });
 
    $db->connect([
 
        'host' => '127.0.0.1',
 
        'user' => 'db_user',
 
        'password' => 'db_password',
 
        'database' => 'test',
 
        'charset' => 'utf8',
 
    ]);
 
    $sql = "SELECT * FROM your_table WHERE id = ?";
 
    $stmt = $db->prepare($sql);
 
    $result = $stmt->execute([1]);
 
    if ($result) {
 
        $row = $stmt->fetch();
 
        $server->send($fd, json_encode($row));
 
    } else {
 
        $server->send($fd, "Error: " . $db->error);
 
    }
 
});
 
$server->start();

上面的代码示例使用了Swoole的协程MySQL客户端,它需要在Swoole 4.1.0 或更高版本中启用协程支持。

`$server->defer` 用于确保在协程结束时关闭数据库连接。


数据库设计三大范式

第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要求,否则,将有很多基本操作在这样的关系模式中实现不了。

第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。

第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF。

函数、存储过程、视图、事务和索引总结

1.函数—创建—调用—变量 (临时变量declare,用户变量set @xx=xx,系统变量@@)

创建,调用,删除

有返回值的sql语句中都不能够执行除了select 。。。into之外

2.存储过程—创建—查看—调用—删除

参数的类型 in out inout类型的参数 通过out类型的参数可以给存储过程实现返回值

存储过程中 可以执行任意的sql语句,更到的灵活,在实际开发中使用更多

相同点:减少网络流量的消耗

3.视图—创建—调用—删除

数据库中存在的虚表

4.事务:安全的更新数据库的一中方式

四大特征:原子性,一致性,隔离性,持久性

三个操作指令 begin commit rollbacl

1.手动开启事务,手动提交事务

2.成功之后,进行提交,一旦提交不能够车脚

3.失败之后,执行回滚操作,回滚去除脏数据

事务是面向当前连接的

事务更新大批量数据的时候,效率高,更新安全(脏数据)

5.索引:提高查询的效率

降低更新的效率

额外消耗磁盘的效率

关于SQLSTATE[HY000] [1698]: Access denied for user ‘root’@’localhost’的问题

问题描述:

客户端可以登录,PHP无法登录。

解决方法:

select user, plugin from mysql.user;
update mysql.user set plugin = 'mysql_native_password' where user='root';

重启msyql。

MySQL View的用法

1、创建视图(CREATE VIEW 视图名称[(column_list)] AS SELECT 语句)

create view employee_view as SELECT * from employee;

完整的创建视图的格式

CREATE ALGORITHM VIEW 视图名称[(column_list)] AS SELECT 语句  WITH  [CASCADED|LOCAL] CHECK OPTION

  1)CASCADED 默认值,表示更新视图的时候,要满足视图和表的相关条件

  2)LOCAL:表示更新视图的时候,要满足该视图定义的一个条件即可

create view employee_view as SELECT * from employee WITH CASCADED CHECK OPTION;

看到很多例子,更新视图可以更新真实表。原因,我是这样理解的:视图并没有保存内容。只是引用数据。那么,更新视图,其实就是以引用的方式操作了真实表
with check option:对视图进行更新操作的时,需要检查更新后的值是否还是满足视图公式定义的条件。通俗点,就是所更新的结果是否还会在视图中存在。如果更新后的值不在视图范围内,就不允许更新如果创建视图的时候,没有加上with check option,更新视图中的某项数据的话,mysql并不会进行有效性检查。删掉了就删掉了。在视图中将看不到了。所以使用WHIT [CASCADED|LOCAL] CHECK OPTION选项可以保证数据的安全性

2、查看视图数据(select column_list from view)

SELECT * FROM employee_view;

3、查看视图(show create view view_name)

show CREATE view employee_view;

4、删除视图(drop view view_name)

drop view employee_view

5、修改视图

  1)CREATE OR REPLACE VIEW 视图名称[(column_list)] AS SELECT 语句

create or replace view employee_view as select eid,ename,salary FROM employee;

    2)ALTER VIEW视图名称[(column_list)] AS SELECT 语句

alter view employee_view as SELECT * FROM employee;

6、修改视图中的数据(update view_name set column where 语句)

UPDATE employee_view set ename='小红' WHERE ename='小个';