第四模块:网络编程进阶&数据库开发 考核实战
MySQL支持事务,其设计目标主要面向联机事务处理(OLTP)的应用。其
特点是行锁设计、支持外键,并支持类似 Oracle 的非锁定读,即默认读取操作不会产生锁。 从 MySQL 5.5.8 版本开始是默认的存储引擎。
MyISAM不支持事务、表锁设计、支持全文索引,主要面向一些 OLAP 数 据库应用,在 MySQL 5.5.8 版本之前是默认的存储引擎(除 Windows 版本外)。数据库系统 与文件系统一个很大的不同在于对事务的支持,MyISAM 存储引擎是不支持事务的。究其根 本,这也并不难理解。用户在所有的应用中是否都需要事务呢?在数据仓库中,如果没有 ETL 这些操作,只是简单地通过报表查询还需要事务的支持吗?此外,MyISAM 存储引擎的 另一个与众不同的地方是,它的缓冲池只缓存(cache)索引文件,而不缓存数据文件,这与 大多数的数据库都不相同。 进程间的通信方式有哪些?进程间通信(IPC)方式主要包括以下几种: (1)管道,分为有名管道和无名管道,是一种半双工的通信方式。 (2)信号量,信号量是一个计数器,可以用来控制多个线程对共享资源的访问。 (3)信号,信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。 (4)消息队列,息队列是消息的链表,存放在内核中并由消息队列标识符标识。 (5)共享内存,共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问.共享内存是最快的IPC(进程间通信)方式。 (6)套接字:可用于不同及其间的进程通信。索引的本质?有什么优缺点?
索引的本质就是排序。
当然,我们一般不会把原始数据集排序,而是把每条记录的键值和这条记录在数据集中的位置,按键值次序做成一个规模较小的数据集,这也就是索引表了。如果还有其它字段也要用于键值查找,则可以再建立别的索引。原始数据集只有一份,索引可以有多个,如果每个索引都把原始数据集排序,则会使数据集被复制很多遍,占用空间过大。
另外,数据库在建立索引时还要考虑数据会插入删除,简单排序的索引会导致插入删除的成本非常高,这时一般会使用B树以方便快速更新。B树相当于把二叉树扩展成n叉树,本质上仍然是键值有序。(索引如何建立的话题内容不少,我们将另行撰文讨论,这里只研讨索引使用)
还有一种引申出来的方法是HASH索引,计算记录键值的某种HASH值,散列到1...k的自然数范围。这样查找时连二分比较也不必做,直接用HASH值定位了。HASH方法只用来做键值的精确查找,不能用来实现区间查找,因为HASH函数并不单调,已经失去原来键值的大小信息了,不过这在许多场景下也够用(按身份证号找人)。HASH索引本质上也是排序,只是用了键值的HASH值来排序。我们下面的讨论还是以普通键值排序为例,结论也适用于HASH索引。
1、写一个程序,包含十个线程,子线程必须等待主线程sleep 10秒钟之后才执行,并打印当前时间;
from threading import Thread,Event,currentThread import time event = Event() def task(): event.wait() for i in range(3): print("name:%s ,time:%s"%(currentThread().getName(),time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))) # print('name:%s time:%s'%(currentThread().getName(),time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()))) if __name__ == '__main__': for i in range(10): t =Thread(target=task) t.start() time.sleep(10) event.set()
2、写一个程序,利用queue实现进程间通信;
q = Queue() def producer(q): for i in range(3): q.put('name:%s is runing %s'%(current_process().name,i)) def consumer(q): while True: res = q.get() if not res:break print(res) if __name__ == '__main__': p1 =Process(target=producer,args=(q,)) p2 = Process(target=producer, args=(q,)) p3 = Process(target=producer, args=(q,)) p4 = Process(target=consumer, args=(q,)) p5 = Process(target=consumer, args=(q,)) p1.start() p2.start() p3.start() p4.start() p5.start() p1.join() p2.join() p3.join() q.put(None) q.put(None) print('main')
3、创建一个表student,包含ID(学生学号),sname(学生姓名),gender(性别),credit(信用卡号),四个字段,要求:ID是主键,且值自动递增,sname是可变长字符类型,gender是枚举类型, credit是可变长字符类型;
create table student1(
id int primary key auto_increment,
sname varchar(16) not null,
gender enum('男','女') default '男',
credit varchar(20)
);
修改ID为1的学生姓名为wupeiqi;
删除该数据;
insert into student1(sname,gender) values('alex','女');
update student1 set sname='wupeiqi' where id =1;
delete from student1 where sname ='wupeiqi';
4、请使用pymysql模块连接你本地数据库,并向student表中插入一条数据;
import pymysql
conn = pymysql.connect(host= 'localhost',user='root',password='123',database='db6')
cursor =conn.cursor()
sql = 'insert into student1(sname,gender) values("egon","男")'
cursor.execute(sql)
conn.commit()
- Node文件模块(文件流读取和写入、path模块等)& Node网络编程(Socket、Server概念)&Nodeweb开发
- ES2015 & babel 实战:开发 NPM 模块
- [实战]浅谈“是”或“否”的ASP.NET 2.0 数据库编程开发
- (十四)洞悉linux下的Netfilter&iptables:开发一个match模块【实战】
- iOS 开发 网络编程详解之TCP&UDP
- Linux驱动程序开发基础, -->内核模块编程,内核的调试方法
- (十四)洞悉linux下的Netfilter&iptables:开发一个match模块【实战】
- 【独立开发人员er Cocos2d-x实战 013】Cocos2dx 网络编程实战之星座运势
- 数据库引擎开发以及常见数据库内部原理学习(3):网络编程基础
- (十四)洞悉linux下的Netfilter&iptables:开发一个match模块【实战】
- (十四)洞悉linux下的Netfilter&iptables:开发一个match模块【实战】
- Visual C# 2008+SQL Server 2005 数据库与网络开发--第5章 T-SQL进阶
- ios开发进阶之多线程03 RunLoop 网络编程
- (十四)洞悉linux下的Netfilter&iptables:开发一个match模块【实战】
- iOS项目开发实战——iOS网络编程获取网页Html源代码
- 【Qt编程】基于Qt的词典开发系列<七>--调用网络API
- 数据库引擎开发以及常见数据库内部原理学习(3):网络编程基础
- IOS开发 - 网络&数据库功能综述
- Oracle 9i & 10g编程艺术-深入数据库体系结构——第一章 开发成功的Oracle应用程序
- Python进阶开发之网络编程,socket实现在线聊天机器人