一、数据库优化策略。
首先从硬件,系统配置,数据库表结构,sql及索引这四个方面考虑优化。
正常来说,硬件和系统配置先撇开不谈。
1、对于数据库表来说,要合理选择适当的字段属性。
①数字类型的字段:不到万不得已不要使用double,这不仅是存储长度的问题更是存储精度的问题。同时固定精度的小数,不建议使用decimal。
②字符类型:尽量避免使用text数据类型,定长字段建议使用char,不定长字段使用varchar,且设定适当的最大长度。
③时间类型:尽量使用timestamp类型,它的存储空间只有datetime类型的一半。对于只需要精确到某一天的数据类型建议使用date类型。
④尽可能将字段使用not null。
2、对于sql语句来说,要书写高效的sql语句,在对sql语句进行分析的时候,可以利用explain看查询计划。
①尽量避免使用select * ,因为查询数量加大的时候,性能的影响不在数据查找,而在I/0操作。
②利用limit 1来取得唯一行
③避免使用 like,exist,in等标准表达式,它们会引起索引无效,而引起全表扫描。
④尽量减少使用负逻辑操作符和函数,它们会导致全表扫描。而且容易出错,可以把含有not 、<>、!=等负逻辑条件表达式转化为意思相当的正逻辑。
⑤尽量利用join来代替子查询
⑥使用union来代替手动创建临时表
⑦必要的时候可以使用事物。
3、对于索引而言,要合理使用索引。
①在经常用作过滤器或者查询频率较高的字段上创建索引。也就是说,索引不要创建在select查询的字段上,而是要放在where条件字段上。
②在sql语句中经常进行group by ,和order by 的字段上创建索引。
③不必要在不同值较少的字段上创建索引,例如性别字段。
④尽量避免对于经常存取的列创建索引。
⑤用于连接的列(主键/外键)创建索引。
⑥在经常存取的多个列上建立复合索引,但要注意复合索引建立的顺序要按照使用的频度来确定。
⑦删除冗余的,不用的索引。
4、选择合理的存储引擎
5、最后,打开慢查询,及时发现需要优化的sql,在表中删除数据之后,要及时地释放空间,例如optimize table 这个操作。
6、合理使用存储过程和视图,适当使用表分割,表分区。
二、larvel或者yii容器的控制反转。
三、冒泡排序,快速排序
1、冒泡排序
• 将序列中所有元素两两比较,将最大的放在最后面。
• 将剩余序列中所有元素两两比较,将最大的放在最后面。
• 重复第二步,直到只剩下一个数。
/**
* 基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上 而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。
* 即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。*/
public bubbleSort($a) {
$temp = 0;
for ($i = 0; $i < count($a) - 1; $i++) {
for ($j = 0; j < count($a) - 1 - i; j++) {
if ($a[$j] > $a[$j + 1]) {
$temp = $a[$j];
$a[$j] = $a[$j + 1];
$a[$j + 1] = $temp;
}
}
}
}
2、快速排序(时间最快)
• 选择第一个数为p,小于p的数放在左边,大于p的数放在右边。
• 递归的将p左边和右边的数都按照第一步进行,直到不能递归。
/**
* 基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,
* 此时基准元素在其 排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
*/
public quick($a2) {
if (count($a2) > 0) { // 查看数组是否为空
$this->_quickSort($a2, 0, count($a2) - 1);
}
}
public _quickSort($list, $low, $high) {
if ($low < $high) {
$middle = $this->getMiddle($list, $low, $high); // 将list 数组进行一分
$this->_quickSort($list, $low, $middle - 1); // 对低字表进行递归排序
$this->_quickSort($list, $middle + 1, $high); // 对高字表进行递归排序
}
}
public getMiddle($list, $low, $high) {
$tmp = $list[$low]; // 数组的第一个作为中轴
while ($low < $high) {
while ($low < $high && $list[$high] >= $tmp) {
$high--;
}
$list[$low] = $list[$high]; // 比中轴小的记录移到低端
while ($low < $high && $list[$low] <= $tmp) {
$low++;
}
$list[$high] = $list[$low]; // 比中轴大的记录移到高端
}
$list[$low] = $tmp; // 中轴记录到尾
return $low; // 返回中轴的位置
}
四、索引类型,存储引擎的区别。
五、php string和array相关的方法。
六、使用redis有哪些好处 与memcached比有哪些优势
1、速度快,因为数据存在内存中
2、redis支持丰富的数据类型,支持string,lists ,sets,sorted set ,hashes
3、支持事物,操作都是原子性的。
4、丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将自动删除。
优势:
1、memcached所有的值均是简单的字符串,key-value型的,而redis支持的数据更多。
2、redis的速度比memcached快很多。
3、redis可以持久化数据。
4、redis单个value最大限制是1GB,而memcached只能保存1mb的数据。
七、一致性哈希算法
八、mysql中,myisam与innodb的区别
1、innodb支持事务,myisam不支持;
2、inndb支持行级锁,myisam支持表级锁;
3、innodb支持mvcc(多版本并发机制),myisam不支持;
4、innodb支持外键,myisam不支持;
5、innodb不支持全文索引,myisam支持;
九、innodb日志与事务的实现方式
事务日志包括:重做日志redo和回滚日志undo
Redo记录的是已经全部完成的事务,就是执行了commit的事务,记录文件是ib_logfile0 ib_logfile1
Undo记录的是已部分完成并且写入硬盘的未完成的事务,默认情况下回滚日志是记录下表空间中的(共享表空间或者独享表空间)一般情况下,mysql在崩溃之后,重启服务,innodb通过回滚日志undo将所有已完成并写入磁盘的未完成事务进行rollback,然后redo中的事务全部重新执行一遍即可恢复数据,但是随着redo的量增加,每次从redo的第一条开始恢复就会浪费长的时间,所以引入了checkpoint机制
Dirty page:脏页 什么意思呢?
一般业务运行过程中,当业务需要对某张的某行数据进行修改的时候,innodb会先将该数据从磁盘读取到缓存中去,然后在缓存中对这条数据进行修改,这样缓存中的数据就和磁盘的数据不一致了,这个时候缓存中的数据就称为dirty page,只有当脏页统一刷新到磁盘中才会是clean page
Checkpoint:如果在某个时间点,脏页的数据被刷新到了磁盘,系统就把这个刷新的时间点记录到redo log的结尾位置,在进行恢复数据的时候,checkpoint时间点之前的数据就不需要进行恢复了,可以缩短时间
十、mysql数据库如何防注入(数据安全策略)
1、使用预编译、和绑定变量;
采用预编译后,sql引擎会预先进行语法分析,产生语法树,生成执行计划,也就是说,后面你输入的参数,无论你输入什么,都不会影响sql的语法结构了,因为语法分析已经完成了,而语法分析主要是分析sql命令,所以即使你后面输入了这些sql命令,也不会被当成sql命令来执行。
2、使用mysql存储过程、
3、利用正则和php addcslashes(),addslashes()函数。
十一、explain 出来的各种item的意义
select-type:表示查询中每个select子句的类型。
type:表示mysql在表中找到所需航的方式
possible-key:指出mysql能适用哪个索引在表中能找到行,查询涉及到的字段 上若存在索引,则改索引将被列出,但不一定被查询使用
key:先是mysql在查询中实际使用的索引,若没有使用索引,则显示为null
key-len:表示索引中使用的字节数,可通过该列计算查询中使用的索引长度
ref:表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。
extra:包含不适合在其他列中显示但十分重要的额外信息
十二:php新特性
1、标量类型声明;
2、返回值类型声明;
3、null合并运算符(??);
4、太空船操作符(组合比较符);
5、通过define()定义常量数组;
6、新增了匿名类
7、unicode codepoint 转译语法;
8、Closure::call()
9、为unserialize()提供过滤
10、IntlChar
11、预期
12、use 加强
13、Generator 加强
14、整除,新增了整除函数 intdiv(),使用实例
十三 给定一个字符串输出字符串的所有排列,例如给定 abc 需要输出 abc acb bac bca cab cba 。
十四 求一个矩阵中的最大二维子矩阵(元素和最大)并说出时间复杂度
十五 sql语句的复习
1、SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsINNER JOIN OrdersON Persons.Id_P = Orders.Id_PORDER BY Persons.LastName
2、SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P
网友评论