admin 发布的文章

php自动加载认知

1:__autoload 当我们调用一个从未定义的类时,就会加载__autoload方法,你可以使用__autoload方法加载文件

auto.php
<?php
function __autoload($className){
    $className = $className.'.php';
    if(is_file($className)){
        require_once "$className";
    }
}

person.php
<?php
require_once 'auto.php';
Data::delData();

2:spl_auto_register() 可以加载自己写的函数来覆盖__autoload()函数

auto_register.php
<?php
function load($className){
    $fileName = $className.'.php';
    if(is_file($fileName)){
        require_once "$fileName";
    }
}
spl_autoload_register('load');

person.php
<?php
//require_once 'auto.php';
require_once 'spl_auto_register.php';
Data::delData();
Data::catchData();

查询优化

1:简述项目中优化SQL语句执行效率的方法,从哪些方面,sql语句性能如何分析

  • 分析查询速度慢的原因
  • 优化查询工程中的数据访问
  • 优化长难的查询语句
  • 优化特定类型查询语句

2:优化速度慢

  • 避免访问太多数据
  • 检查是否在检索大量的超过需要的数据
  • 确认MySQL服务器是否在分析大量不必要的数据行
  • 避免:

    查询不需要的数据,使用limit
    多表关联,指定字段
    避免select *
    重复的查相同的数据,可以缓存

  • explain进行分析,添加索引
  • 修改数据表的结构,修改数据表范式
  • 重写SQL语句

3:优化长难(mysql扫描的很快,只是响应数据就很慢了)

  • 切分查询

复杂查询可以在特殊的情况分解成多个简单查询

  • 分解关联查询

关联分解成多条SQL来执行
提高缓存
执行单个查询可以减少所得竞争

4:优化特定类型

  • count(*)会忽略所有的列,直接统计所有列数,因此不要使用count(列名)

    增加汇总表
    使用缓存

  • 关联查询

    给on或字句的列上加索引
    确保group by 和order by 中只有一个列这样mysql才有可能使用索引
    少使用子查询

  • 优化limit分页

    limit偏移量大的时候,查询效率较低
    可以记录上次查询的最大ID,下次查询时直接根据该ID来查询
    加个条件where id > 上次查询的最大ID

索引创建原则&注意事项

1:MySQL索引创建原则

  • 最适合索引的列是出现在where字句中的列,或连接子句中的列而不是出现在select关键字后的列(联查的on后)
  • 索引列的基数越大,索引的效果越好
  • 对字符串进行索引,应该制定一个前缀长度,可以节省大量的索引空间
  • 根据情况创建复合索引,复合索引可以提高查询效率(类似章和节)
  • 避免创建过多索引,索引会额外占用磁盘空间,降低写操作效率
  • 主键尽可能选择较短的数据类型,可以有效减少索引的磁盘占用提高查询效率

2:MySQL索引注意事项

  • 复合索引遵循前缀原则(连续的左侧)(最左侧原则)

    key(a,b,c) a,b,c; a,b; a(这些才能生效)
    只创建一个索引,同时作用在这个组合上
    效果是缩短这个范围(章节段)

  • like查询,%号不能在前,可以使用全文索引

    where name like "%wang";
    索引不生效

  • column is null可以使用索引
  • 如果MySQL估计使用索引比全表更慢,会放弃使用索引

    where id >1 and id < 100
    查找90条

  • or前的条件有索引,后面的没有,索引都不会被用到(这也是为什么尽量少用or的原因)

    where id(它有索引) > 20 0r age(没有索引) < 30

  • 列类型是字符串,查询时一定要给值加引号,否则索引失效

    name varchar(10)
    "100"
    where name = 100(这样能找到,但是不会用到索引)

例:
1.使用了!=运算符及not in, not exist等,认为产生的结果集很大,往往导致引擎不使用索引而使用全局扫描;
2.对索引使用了函数,如where substr(name,1,3)='mark',会导致索引无效

高性能索引基础

1:索引的含义

  • 类似书籍的目录

2:索引对性能的影响

  • 大大减少服务器需要扫描的数据量
  • 帮助服务器避免排序和生成临时表
  • 将随机的I/O变顺序I/O
  • 大大提高查询速度,降低写的速度,占用磁盘空间(索引也是一种数据)

3:使用场景

  • 非常小表,不适用
  • 中到大兴表,索引非常有效
  • 特大型的表,建立和使用索引的代价将随之增长,可以使用分区技术来解决

4:索引的类型

  • 普通索引:最基本的索引,没有任何约束限制
  • 唯一索引:与普通索引类似,但是具有唯一性约束
  • 主键索引:特殊的唯一索引,不允许有空值

5:主键和唯一索引的区别

  • 一个表只能有一个主键索引,可以有多个唯一索引
  • 主键索引一定是唯一索引,唯一索引不是主键索引
  • 主键可以与外键构成完整性约束,防止数据不一致

6:组合索引

  • 将多个列组合在一起创建索引,可以覆盖多个列
  • 复合索引,在索引建立语句中同时包含多个字段名,最多16个字段

7:其它索引

  • 外键索引:只有InnoDB类型的表才可以使用外键索引,保证数据一致性,完整性和实现级联操作
  • 全文索引:只能用于MyISAM,并且只能对英文进行全文检索

mysql表引擎

1:inodb优势

默认事物型,最重要最广泛,性能非常优秀
数据存储共享表空间
对主键查询的性能高于其他类型的存储引擎
内部优化较好,读取时自动在内存构建hash索引,插入时自动构建缓存区
通过一些机制和工具支持真正的热备份
支持崩溃后的安全恢复
支持行级锁
支持外键

2:MyISAM:

5.1之前,是默认的存储引擎
拥有全文索引,压缩,空间函数
不支持事务和行级锁,不支持崩溃后的安全恢复
存储在两个文件,myd(数据)和myi(索引)
设计简单,某些场景性能很好)(*查)

mysql数据类型

1:整形

  • TINYINT SMALLINT MEDIUMINT INT BIGINT

属性:unsigned表示无符号的意思,也就是非负数,只用于整型
长度:可以为整数类型指定宽度,对大多数应用是没有意义的,不会限制值的合法范围,只会影响显示字符的个数;如果没有达到这个宽度,会在前面zerofill
FLOAT DOUBLE DECIMAL
DECIMAL可存储比BIGINT还大的整数,可以用于存储精确的小数
FLOAT和DOUBLE类型支持使用标准的浮点进行近似计算(小数点后有取值范围)计算

2:字符串

  • VARCHAR CHAR TEXT BLOB

varchar用于存储可变长度字符串,它比定长类型更节省空间
varchar使用1个或2个额外字节记录字符串的长度,列长度小于255字节,使用1个字节表示,否则用2个,会截取超过设定的长度
char定长,根据定义的长度分配足够的空间,会采用空格填充不够的空间
char适合存储很短的字符串或者所有值都接近同一个长度(密码),也会被截断超过定义的长度
对于经常变更的数据,char比varchar更好,char不容易产生碎片
对于非常短的列,char比varchar在存储空间上更有效率
尽量分配真正需要的长度空间,减少消耗的内存
blob/text少用,会产生临时表,消耗更大的内存

3:枚举

优势可以使用枚举代替常用的字符串类型
把不重复的集合存储成一个预定义的集合
非常紧凑,把列表压缩到一个或两个字节
内部存储的是整数
尽量避免使用数字作为枚举的常量,易混乱
排序按照内部存储的整数进行排序
使表大大减小

4:时间

尽量使用timestamp,比datetime空间效率高
用整数保存时间戳的格式通常不方便处理
如果存储微妙,可以使用bigint

php目录处理

1:目录相关函数

  • 名称函数:basename(), dirname(), pathinfo()

  • 目录读取:opendir(), readdir(), closedir(), rewinddir()
  • 目录删除:rmdir()
  • 目录创健:mkdir()

2:其他相关函数

  • 文件大小:filesize()

  • 目录大小:disk_free_space(), disk_total_space()
  • 文件拷贝:copy()
  • 删除文件:unlink()
  • 文件类型:filetype()
  • 重命名文件或者目录:rename()
  • 文件截取:ftruncate()截取到指定大小
  • 文件属性:file_exists(),is_readable(),is_writable()

php文件处理

1:文件读取/写入操作

  • 打开:fopen()
  • 写入:fwrite() fputs()
  • 读取:fread() fgets() fgetc()
  • 关闭:fclose()

2:不需要fopen()打开的函数

  • file_get_contents()
  • file_put_contents()

3:其他读取

  • file()//数组

  • readfile()//读取到,并且放置到缓存区

4:访问远程文件

  • 开启allow_url_fopen,http协议连接只能使用只读,ftp协议可以使用只读或者只写

正则表达式

1:正则表达式的作用&要点

  • 分割,查找,匹配,替换字符串
  • 分割符:正斜线(/)、hash符号(#)以及取反符号(~)
  • 通用原子:\d,\D,\w,\W,\s,\S
  • 元字符:. * $ + {n} {n,} {n,m}, [], (), [^] | [-]
  • 模式修正符:i m e s U x A D u

php系统函数

1:时间日期函数:

  • data(),strtotime(),mktime(),time(),microtime()
  • date_default_timezone_set()

2:IP处理函数:

  • ip2long(),long2ip()

3:打印处理函数:

  • print(),printf(输出格式化字符串),print_r(打印关于变量的易于理解的信息)
  • echo,sprintf(Return a formatted string)
  • var_dump(),var_export(输出或返回一个变量的字符串表示)

4:序列化及反序列化函数:

  • serialize(),unserialize()

5:字符串函数:

  • implode(),explode(),join(),strrev(),trim(),
  • strstr(),number_format()...

6:数组处理函数:

  • array_keys(),array_values(),array_diff(),array_intersect(),array_merge(),
  • array_shift(前出栈),array_unshift(前入栈),array_pop(后出栈),array_push(后入栈),//模拟队列的双向处理
  • sort()...