2016年4月

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',会导致索引无效