最近面试遇到了一些常问的问题,这里记录一下:
1、redis和memcache区别
http://timyang.net/data/redis-misunderstanding/
(1)memcache 是多线程,非阻塞IO复用的网络模型,redis使用单线程的IO复用模型
(2)memcache使用的libevent包,redis使用的AeEvent框架
(3)redis能对数据进行持久化保存,即保存在硬盘中,而memcache只保存在内存中,断电后会消失
(4)memcache支持的数据类型只有key-value,而redis支持的数据类型有:string,list ,set ,sorted set 和hash
(5)Redis支持数据的备份,即master-slave模式的数据备份
2、myisam与innodb区别
http://blog.sina.com.cn/s/blog_6e322ce70100xwve.html
(1)MyIsam不支持事务,而Innodb支持
(2)InnoDB不支持FULLTEXT类型的索引
(3)DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除
(4)MyIsam的每个表保存3个文件:frm、MYD、MYI,而Innodb只保存一个frm,而且受限操作系统文件大小。
(5)MyIsam的查询速度更快.
(6)MyIsam只支持表级锁,Innodb支持行级锁。
3、varchar与char区别
(1)char是一种固定长度的类型,varchar则是一种可变长度的类型
(2)char最大长度是255,varchar最大长度是0到65535
4、myql 中int的长度代表的含义
int的长度,并不代表能够存储数字的长度,而是标示这个数字的长度,如果超过这个长度也是可以的,一般默认11。这是因为int是4个字节,也就是32位,所以代表的数值是-2147483648到2147483647,所以是默认11
5、联合索引
如果建立联合索引的话,比如说对t1、t2、t3建立联合索引(create index f_map on t_map(t1,t2,t3)),那也就是说同时也对<t1>,<t1,t2>,<t1,t2,t3>建立了索引。在使用联合索引时一定要注意字段的个数和顺序。而<t1 or t2>不会使用索引
6、使用什么函数来计算程序执行的时间
microtime()
7、gbk和utf8字符编码的区别
gbk汉字占2个字节,GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准,GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1
utf8为中文三个字节,英文为1个字节
使用mb_convert_encoding,mb_detect_encoding函数来判断编码
$encode = mb_detect_encoding($keytitle, array("ASCII",'UTF-8′,"GB2312′,"GBK",'BIG5′)); if ($encode == “UTF-8″){
$keytitle = iconv("UTF-8″,"GBK",$keytitle);
}
8、什么是索引,什么是聚集索引?索引优化?
http://blog.codinglabs.org/articles/theory-of-mysql-index.html#more-100
索引:只有当经常查询索引列中的数据时,才需要在表上创建索引。索引占用磁盘空间,并且降低添加、删除和更新行的速度。分类:唯一索引、主键索引和 聚集索引。
聚集索引:聚集索引规定数据在表中的物理存储顺序,一个表只能包含一个聚集索引
索引优化:
(1)、尽量不要让字段默认为null,列中包含有NULL值都将不会被包含在索引中
(2)、使用短索引,例如,如果有一个CHAR(255)的 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
(3)、不要在列上进行运算,例如select * from users where YEAR(adddate)<2007;
(4)、like语句:一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
复合索引:
http://blog.csdn.net/enough_br/article/details/7467745
9、如何进行数据库优化?
http://tech.it168.com/a2009/0526/577/000000577940_1.shtml
数据库范式:目前关系数据库有六种范式,只需满足第三范式(3NF)就行了。(1NF)无重复的列,实体中的某个属性有多个值时,必须拆分为不同的属性;(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分,选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息(表中不要包含其他表中已经设定过的非主键字段)
(1)按照范式建表(2)适当建立索引(3)对表进行水平和垂直划分(4) 选择适当的字段类型,特别是主键(datetime占用8个字节,而timestamp占用4 个字节)(5)文件、图片等大文件用文件系统存储,不用数据库(6)选择合适的引擎(7)数据库读写分离
http://www.cnblogs.com/villion/archive/2009/07/23/1893765.html
10、php优化工具
APC:PHP有效的开放源高速缓冲储存器工具,它能够缓存opcode的php中间码。
Zend Optimizer:实现的原理是对那些在被最终执行之前由运行编译器(Run-Time Compiler)产生的代码进行优化。
11、如何解决js跨域问题
http://my.oschina.net/bugyang/blog/112914
12、数据库的三大范式
(1)第一范式(确保每列保持原子性)
(2)第二范式(确保表中的每列都和主键相关)
(3)第三范式(确保每列都和主键直接相关,而不是间接相关)
13、对数据库进行水平和垂直划分
水平划分:数据库有上千万条记录,分成多张表,按照月份划分。
垂直划分:数据库可能只有几万条记录,但是表中有一个字段长度很大,可以将这个字段分出表去
14、单例模式
class Person{ private static $instance; private function __construct(){ } public static function instance(){ if(!self::$instance){ self::$instance = new Person(); } return self::$instance; } public function test(){ echo "test"; } } $p1 = Person::instance();