mysql 07.10
1.select的问题
1.当进程被唤醒不清楚到底哪个socket有数据,只能遍历一遍
2.每一次select的执行,都需要将这些进程再加入到等待队列中
为了防止重复添加等待队列,当某一次操作完成时,也必须从操作队列中删除进程,所以select最大限制被设置为了1024,从这方面考虑select都不如多线程
poll和epoll就是为了解决上述问题而被推出的
poll只是简单对select进行了优化,不够完美,epoll才是最后的解决方案
epoll仅在linux中使用
import socket,select
s = socket.socket()
s.bind(('127.0.0.1',1688))
s.listen(5)
epoll=select.epoll()#创建一个epoll对象
#注册读就绪事件(有数据可以读取了)
epoll.register(s.fileno(),select.EPOLLIN) # s.fileno()用于获取文件描述符
fd_sockets = {s.fileno():s}#存贮文件描述符与socket的对应关系
whlie True:
    #该函数是阻塞会直到你关注的事件发生
    #返回值为文件描述符与发生的事件类型 是一个列表 列表中是元组 第一个是描述符 第二个是事件
    for fd,event in epoll.poll():
        print('有socket 搞事情了!')
        sock = fd_sockets[fd] 取出对应的socket对象
        
        #判断socket是服务器还是客户端
        if sock == s:
            client,addr = sock.accept() #执行对应的接收和发送
            #注册客户端的事件
            epoll.register(client.fileno(),select.EPOLLIN)
            #将对应关系存储到字典中
            fd_sockets[client.fileno()]=client
            print('来了一个客户端。。。')
            
        elifevent == select.EPOLLIN: #客户端的处理
            data = sock.recv(1024)
            if not data:
                epoll.unregister(fd)#注销事件
                fd_sockets.pop(fd)#从字典中删除
                sock.close()#关闭socket
                continue
                
            print('%s 发来问候:%s'%(sock,data.decode('utf-8')))
            #将事件转换为可写
            epoll.modify(fd,select.EPOLLOUT)
         else:
            sock.send('我是服务器 收到请回复'.encode('utf-8'))
            
            #将事件转换为可读
            epoll.modify(fd,select.EPOLLIN)           
epoll解决select的两个问题的方法:
- epoll把对于等待队列的操作与阻塞进程分开了
 - epoll自己维护了一个等待队列 避免了遍历所有socket
 
2.数据库基本概念
数据库可以当成是存贮数据的仓库,其本质就是一套基于CS结构的客户端和服务器程序,最终的数据存储在服务端的磁盘中。
分布式 每个服务器提供不同的服务,有时候某个业务流程可能会涉及到多个服务器
优点:耦合度降低,易维护,缺点:通讯繁琐,容灾性没有集群好
集群 所有服务器提供的服务是一模一样的,
优点:容灾性强,易扩展 可插拔
直接使用文件存储带来的问题:
- 速度慢
 - 程序将来可能分布在不同的机器上
 - 用户权限管理
 - 多个客户端并发访问 数据要保证安全
 
数据库的分类
- 关系型数据库
 
- mysql 免费开源,已被oracle收购了,适用于中小型企业
 - sqlserver 微软推出 只能在Windows平台
 - oracle 目前最强大的关系型数据库,主要应用在集群和用户管理上,适合大型企业
 - db2 IBM产品,面向企业级用户,捆绑硬件销售
 
- 非关系型数据库
 
- mongoDB
 - redis
 - memcache
 
其它概念
数据Column 文件中的某个字符串
记录Row 文件中的某一行
表Table 某个文件
库DataBase 就是一个文件夹
DBMS 数据库管理系统(指的就是数据库软件)
数据库服务器 运行DBMS的计算机
安装数据库
采用压缩包的方式来安装,解压到本地即可
bin 存贮所有支线文件
data 存贮数据的位置
简单的使用步骤:
bin下有mysqld.exe 是服务器端程序 mysql.exe是客户端程序
需要先运行mysqld.exe
运行客户端时,如果直接双击运行进入游客模式
正确的运行方式是在终端里指定用户名密码等参数
常见的参数
- 
-h 主机名称,如果是本机 可以忽略
 - 
-P指定端口默认3306 可以不写
 - 
-u指定用户名
 - 
-p指定密码
 
添加环境变量
注册系统服务:
注册 mysqld --install
删除 sc delete mysql ()
启动/停止服务 net start/stop mysql
查找某个进程 tasklist|findstr mysqld
杀死进程 taskkill/f/pid 端口号
mysql 5.6管理员密码的设置
- 知道原始密码
 
- 
1.1 登录到mysql执行更新语句来修改
 - 
update user set password = password('123') where host='localhost' and user='root';
 - 
刷新flush privileges; 或者重启mysqld
 - 
2.2mysqladmin小工具
 - 
mysqladmin -uroot -p123 password 321
 
** 2.忘记原始密码**
- 2.1 删除权限相关的文件
 - 2.2 跳过授权表
 - 手动启动mysql指定参数
 - mysql --skip-grant-tables
 - update user set password=password('123') where host host='localhost' and user='root';
 - 重启mysqld即可
 
简单的使用
数据必须找个文件存起来,也就是表,表必须存在于库中也就是文件夹
创建数据库 创建表
库的操作
#切换数据库
use 数据库名称 可以不加分号
#查看所有数据库
show databates;
show create databases; 查看数据库详细详细
#删除数据库
drop database 数据库名称
#修改数据库编码 可以进入到数据库文件夹中修改db.opt
#第一行是编码 第二行是排序规则 自己搜索
#修改数据库名 可以直接修改对应的文件夹名称
命名规范:
1.不区分大小写
2.不要使用关键字 例如create select 等。。。
3.不能使用纯数字
4.可以使用下划线 通常字符下划线数字的组合
标的操作
#创建表
create table 表名称(列名称 列的数据类型 ,列名称2 猎德数据类型)
charset gbk;
#编码规则
create table 表名称(列名称 列的数据类型,列名称2 猎德数据类型)
charset gbk;
#查看当前库下的所有表
show tables;
#查看表结构
desc 表名称;
#查看表的创建语句
show create table 表名称;
#删除表
drop table 名称;
#清空表数据 重建表
truncate table 名称;
#修改表结构
#添加字段
alter table 表名 add 列表名称 数据类型;
#删除字段
alter table 表名 drop 列名称;
#修改数据类型
alter table 表名 modify 列名称 新的数据类型;
#修改列名
alter table 表名 change 旧的列名 新的列名称 新的类型
#修改标的名称
rename table 旧名称 to 新名称
#修改编码
alter table 表名 charset utf8
                    
                
                
            
        
浙公网安备 33010602011771号