LS面试总结

来源:互联网 发布:社交网络头像 编辑:程序博客网 时间:2024/05/20 16:32


 第一次面试php相关的工作,由于php是自学的,所以没有实战经验,加上许久没有面试有点紧张,于是乎。。。悲剧了,我把答得不好的题记下来加深印象:
a. 将字符串的最后一个","去掉怎么弄?
   本人之前刚学正则表达式,于是就开始想用正则的方式将最后一个符号去掉,结果弄巧成拙,其实就用最简单的集中字符串函数就可以轻松搞定
   1. substr($str,0,strlen($str)-1);sunstr($str,0,-1);
   2. rtrim($str,' ,');
   3. substr_replace($str,'',strlen($str-1));
b.分页方法需要的几个必备参数,用sql写出来(不用考虑是否有上一页下一页等这些参数)?
  当时的回答是:1.当前页面 $cur_page;2.每页数量 $page_rows; 
 sql语句是:select * from a limit ($cur_page-1)*$page_rows,$page_rows;
c. 当有数百万的数据量时,limit语句取第一万页,如果用这种普通方法的话会先取出所有数据再逐句计算直到第一万页的首行开始读取数据,这样会造成效率低下,如何优化?
  当时没有思路,面试者说就是根据数据默认或者指定的排序规则来设定数据过滤条件,比如按照id升序排列,则取到9999页的最后一条数据的id为ID_9999,在取10000页的数据时加过滤条件id>ID_9999,这样就能省去了数据库系统取值的时间。
  回来之后细想这个问题,如果条件按照年龄排序,而每个年龄又有好多数据,这样的话之前的解决方案就不可行了。

经过验证,这个方法能解决我的第二个问题

其实select * from emp oreder by age limit 10000,10 的最大性能是耗在mysql要扫描并丢掉10000“行”的整行数据
Select id From emp Order By age limit 10000,1 
和 
Select id From emp Order By age limit 10000,10
的性能应该是“差不多的”
所以,更好的方式是这样
SELECT * FROM emp
INNER JOIN( SELECT id FROM emp ORDER BY age LIMIT 10000,10 ) 
AS tmp USING(id)


验证(age字段有索引):
select * from emp oreder by age limit 2000000,10; 用时13.44s
SELECT * FROM emp
INNER JOIN( SELECT id FROM emp ORDER BY age LIMIT 2000000,10 ) 
AS tmp USING(id)   用时6.19s 
emp表的字段越多,能节省的时间越多

d. 笔试题中有一个写sql的题:插入一条id为‘B’数据到表A中,如果id存在则更新该条数据,id不存在则插入到数据库
  两种 方法:1. replace into A(id,name,age) values ('B','C','D');
                       2. insert into A(id,name,age) values ('B','C','D') on duplicate key update name='C',age='D';



各位大神看到有问题的话请指点,大家一起讨论

0 0
原创粉丝点击