数据库的select底层实现

话题:数据库中的select底层?
一、从数据库查询数据的角度,大概架构(前提:客户端需要将查询语句发送到服务器端)
1.接到语句查找sql计划缓存
如果没有—_—||
2.检查语句合法性(对sql语句语法的检查,)

3.检查语言含义(对sql语句的所包含的表名,字段名)

4.获得对象解析锁

5.核对用户权限是否有访问数据的权限

探究到着,我不禁想到,平时写sql语句的时候,就是这样的啊!
6.确定最佳执行计划(自我优化,很有限),同时将当前sql语
句与最佳执行计划保存到高速缓存

二、从select的原型考虑
select()原型主要是建立在fd_set类型的基础上的。fd_set是一组文件描述字(fd)的集合,它用一位来表示一个fd,对于fd_set类型通过下面四个宏定义来操作:
fd_set set;
FD_ZERO(&set); /将set的所有位置0,如set在内存中占8位则将set置为00000000/
FD_SET(0, &set); /* 将set的第0位置1,如set原来是00000000,则现在变为10000000,这样fd==1的文件描述字就被加进set中了 */
FD_CLR(4, &set); /*将set的第4位置0,如set原来是10001000,则现在变为10000000,这样fd==4的文件描述字就被从set中清除了
FD_ISSET(5, &set); /* 测试set的第5位是否为1,如果set原来是10000100,则返回非零,表明fd==5的文件描述字在set中;否则返回0*/

select函数的的接口:
int select(int nfds, fd_set readset, fd_set *writeset,fd_set exceptset, struct timeval *timeout);
功能:
测试指定的fd可读?可写?有异常条件待处理?
参数:
1.nfds:需要检查的文件描述字个数(即检查到fd_set的第几位),数值应该比三组fd_set中所含的最大fd值更大,一般设为三组fd_set中所含的最大fd值加1(如在readset,writeset,exceptset中所含最大的fd为5,则nfds=6,因为fd是从0开始的)。设这个值是为提高效率,使函数不必检查fd_set的所有1024位。
2.readset:用来检查可读性的一组文件描述字。
3.writeset:用来检查可写性的一组文件描述字。
4.exceptset:用来检查是否有异常条件出现的文件描述字。
5.timeout:有三种可能:
1. timeout=NULL(阻塞:直到有一个fd位被置为1函数才返回)
2.timeout所指向的结构设为非零时间(等待固定时间:有一个fd位被置
为1或者时间耗尽,函数均返回)
3. timeout所指向的结构,时间设为0(非阻塞&

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值