mysql
事务
定义
一个最小不可分割的单元。举个例子来讲:在一个OA的管理系统来将,当有一个员工离职时,需要删除员工的基本资料,同时也需要删除其他的资料。这些数据库操作就构成了一个事务。本文阐述的事务为Ionodb引擎。Myisam不支持事务。
特性
- 原子性:一个事务要么全部执行,要么全部不执行,不会存在结束在一个中间的环节,当事务在执行过程中发生一个错误的时候,就会回滚到事务开始前的状态。
- 一致性:事务在执行前和执行后保证数据的完整性
- 隔离性:mysql允许多个事务并发的对其数据进行读写的操作,隔离性保证的是在多个事务并发的执行时由于交叉执行导致数据的不一致。
- 持久性:事务提交后对数据的修改是永久的,即使出现系统故障也不会数据丢失。
隔离级别
- 读未提交:一个事务在未提交时,其他的事务可以看到该事务的变更。
- 读提交:一个事务在提交后才能被其他事务看到变更。
- 可重复读:在同一个事务中查询结果必须一致。
- 可串行化:对同一条记录,写会加锁,读也会加锁,后访问的事务需要等前面的事务结束之后才能执行。
幻读&脏读和死锁的问题
幻读
事务对一个范围的数据进行两次查找时,两次查找的数据不一致。称为幻读。
举例说明:当事务A对一个范围的数据进行多次查找时,事务B对此范围新增了一条数据,导致事务A第二次查找时查到了事务B插入的数据,产生了数据一致性的问题。
原因说明:
在可重复读隔离级别下,普通查询是快照读,是不会看到别的事务插入的数据的,幻读只在当前读下才会出现。
脏读
事务A读到了事务B的未提交的数据,因为事务B可能会回滚。所以读取到的数据不能保证是最终写入的数据。这种情况叫做脏读。
这种情况一般只会存在事务的隔离级别为读未提交的场景下。
死锁
两个事务在执行过程中对于资源抢占而造成都互相等待的现象,在没有外力的情况下,他们都无法推进下去。
引擎
InnoDB&Myisam
在mysql5.1之前的版本默认的存储引擎为Myisam,从5.5以后的版本默认引擎为InnoDB。
特点:
InnoDB引擎的特点是:行级锁,事务安全(ACID),支持外键,但是不支持全文索引。提供了具有提交,回滚,崩溃恢复能力的事务安全引擎。InnoDB是为了处理巨大量的数据时保证最大的性能而设计的。
MyISAM存储引擎的特点是:表级锁、不支持事务和全文索引,适合一些CMS内容管理系统作为后台数据库使用,但是使用大并发、重负荷生产系统上,表锁结构的特性就显得力不从心;
索引
索引分类
1.普通索引
2.唯一索引
3.主键索引
4.组合索引
5.全文索引
表结构
PHP
数组
排序
冒泡
// 冒泡排序
function bubbleSort($arr)
{
$len = count($arr);
for ($i = 0; $i < $len -1; $i++) {//循环对比的轮数
for ($j = 0; $j < $len - $i - 1; $j++) {//当前轮相邻元素循环对比
if ($arr[$j] > $arr[$j + 1]) {//如果前边的大于后边的
$tmp = $arr[$j];//交换数据
$arr[$j] = $arr[$j + 1];
$arr[$j + 1] = $tmp;
}
}
}
return $arr;
}
$arr = [3,23,42,11,21,45,212];
var_dump(bubble_sort($arr));
快排
function quick(array $array)
{
if(count($array) <= 1) {
return $array;
}
$key = array[0];
$left = [];
$right = [];
for($i = 1 ;$i < count($array);$i++) {
if($array[$i] <= $key) {
$left[] = $array[$i];
}else{
$right[] = $array[$i];
}
}
$left = quick($left);
$right = quick($right);
return array_merge($left,[$key],$right);
}
$array = [23,42,22,11,44,421];
$array = quick($array);
##可优化的点:
1.key取值的问题。可以取多个值,使用中间值做key,尽量避免key在取到一个边缘值的情况。
2.如果已知数组的长度和范围,尽量不要使用递归
设计模式
单例
class mysql{
private static $instence;
private function __construct(){}##防止被实例化
private function __clone(){} ##防止被克隆
public funtion getInstance()
{
if(!self instanceof self) {
self::$instance = new self();
}
return self::$instance;
}
}