1)设计模式
2)数据库引擎
1.数据库引擎的最基本概念(必背):
每种数据库的数据格式,内部实现机制都是不同的,要利用一种开发工具访问一种数据库,就必须通过一种中介程序,这种开发工具与数据库之间的中介程序就叫数据库引擎。
数据库应用项目是通过数据库引擎与数据库链接的。何为数据库引擎呢?简而言之,数据库引擎就是驱动各种数据库的程序,它负责处理数据库相关工作的整个核心部份。同样的,数据库应用项目的操作指令,均会通过数据库引擎的处理作用到数据库上。
2.面试官问你用过什么数据库,答mysql.其他的只是略知一二.
MySQL数据库引擎:
你能用的数据库引擎取决于mysql在安装的时候是如何被编译的。要添加一个新的引擎,就必须重新编译MYSQL。在缺省情况下,MYSQL支持三个引擎:ISAM、MYISAM和HEAP。另外两种类型INNODB和BERKLEY(BDB),也常常可以使用。
ISAM
  ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL能够支持这样的备份应用程序。
MYISAM
  MYISAM是MYSQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MYISAM还使用一种表格锁定的机制,来优化多个并发的读写操作。其代价是你需要
经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MYISAM还有一些有用的扩展,例如用来修复数据库文件的MYISAMCHK工具和用来恢复浪费空间的MYISAMPACK工具。
MYISAM强调了快速读取操作,这可能就是为什么MYSQL受到了WEB开发如此青睐的主要原因:在WEB开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和INTERNET平台提供商只允许使用MYISAM格式。
HEAP
  HEAP允许只驻留在内存里的临时表格。驻留在内存使得HEAP比ISAM和MYISAM的速度
都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会
丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间,HEAP表格在你需要使用SELECT
表达式来选择和操控数据的时候非常有用。要记住,用完表格后要删除表格。
INNODB和BERKLEYDB
  INNODB和BERKLEYDB(BDB)数据库引擎都是造就MYSQL灵活性的技术的直接产品,
这项技术就是MySql++ API。在使用MySql的时候,你所面对的每一个挑战几乎都源于ISAM
和MYIASM数据库引擎不支持事务处理也不支持外来键。尽管要比ISAM和MYISAM引擎慢很多,但是INNODB和BDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,如果你的设计需要这些特性中的一者或者两者,那你就要被迫使用后两个引擎中的一个了。
3)索引分类
就说你只用mysql。它的索引分类(很简单很基础,必须全部背会)
在数据库表中,对字段建立索引可以大大提高查询速度。通过善用这些索引,可以令MySQL的查询和运行更加高效。索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。下面介绍几种常见的MySQL索引类型。
1、普通型索引
这是最基本的索引类型,而且它没有唯一性之类的限制。普通索引可以通过以下几种方式创建:
(1)创建索引,例如CREATE INDEX 索引的名字ON tablename (列名1,列名2,...); (2)修改表,例如ALTER TABLE tablename ADD INDEX 索引的名字(列名1,列名2,...);
(3)创建表的时候指定索引,例如CREATE TABLE tablename ( [...], INDEX 索引的名字(列名1,列名
2,...) );
2、唯一索引
这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。唯一性索引可以用以下几种方式创建:
(1)创建索引,例如CREATE UNIQUE INDEX 索引的名字ON tablename (列的列表); (2)修改表,例如ALTER TABLE tablename ADD UNIQUE 索引的名字(列的列表); (3)创建表的时候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE 索引的名字(列的列
表) );
3、主键
主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”。如果你曾经用过
AUTO_INCREMENT类型的列,你可能已经熟悉主键之类的概念了。主键一般在创建表的
时候指定,例如“CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); ”。但是,
我们也可以通过修改表的方式加入主键,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每个表只能有一个主键。(主键相当于聚合索引,是查最快的索引)
4、单列索引和多列索引
索引可以是单列索引,也可以是多列索引。
(1)单列索引就是常用的一个列字段的索引,常见的索引。
(2)多列索引就是含有多个列字段的索引
alter table student add index sy(name,age,score);
索引sy就为多列索引,多列索引在以下几中情况下才能有效:
select * from student where name='jia' and age>='12' //where条件中含有索引的首列字段和
第二个字段
select * from student where name='jia' //where条件中只含有首列字段
select * from student where name='jia' and score<60//where条件中含有首列字段和第三个字
总结:多列索引只有在where条件中含有索引中的首列字段时才有效
5、选择索引列
应该怎样选择索引列,首先要看查询条件,一般将查询条件中的列作为索引
4)数据结构数组和链表的区别(经典又基本的问题)
二者都属于一种数据结构:
从逻辑结构来看
1. 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;数组可以根据下
标直接存取。
2. 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项,非常繁琐)链表必须根据next指针到下一个元素
从内存存储来看
1. (静态)数组从栈中分配空间, 对于程序员方便快速,但是自由度小
2. 链表从堆中分配空间, 自由度大但是申请管理比较麻烦
从上面的比较可以看出,如果需要快速访问数据,很少或不插入和删除元素,就应该用数组;相反,如果需要经常插入和删除元素就需要用链表数据结构了
5)管道(问到linux跑不开管道)
管道是最常见的Linux下进程与进程间的通信方式。实际上,管道是一个固定大小的
缓冲区。在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不象文件那样
不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种
情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出
足够的空间供write()调用写。
· 读取进程也可能工作得比写进程快。当所有当前进程数据已被读取时,管道变空。当这
种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题。
注意:从管道读数据是一次性操作,数据一旦被读,它就从管道中被抛弃,释放空间以便写更多的数据。
/*使用pipe实现父进程向子进程发送信息*/(最好能读懂,我们大机上课讲的程序)
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
下载mysql为什么下载不了intmain()
{
intfd[2];
pipe(fd);//创建管道
pid_tchild;
child=fork();//创建子进程
charbuff[15];//子进程用于读取的缓冲区
chardata[]="Hello!";//父进程用于写入的数据
if(child==-1)//出错处理
{
perror("Child:");
exit(1);
}
elseif(child==0)//子进程从管道中读取信息到buff
{
close(fd[1]);
if(read(fd[0],buff,15)>0)
{
printf("pid=%d\tppid=%d\t|%s\t<Read>\n",getpid(),getppid(),buff);
}
close(fd[0]);
exit(0);
}
else//父进程通过data向管道中写入信息
{
close(fd[0]);
if(write(fd[1],data,15)>0)
{
printf("pid=%d\tppid=%d\t|%s\t<Write>\n",getpid(),getppid(),data);
}
close(fd[1]);
exit(0);
}
waitpid(child,NULL,0);//等待子进程结束exit(0);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。