2020PHP面试总结

3 篇文章 0 订阅


1.mysql 分表,按月按年 6月 和 7月怎么查询
1.1 索引
    --全文检索索引
    --空间索引
    --主键索引
    --普通索引
    --唯一索引
    --组合索引 由多个字段组成的索引叫组合索引
          1、组合索引字段无论顺序如何改变都会用到索引,前提是所有字段都在where条件上。
        2、如果想要使用一个或者两个字段在where条件上,必须有组合索引里的第一个字段,但是与顺序无关,例如a,c或c,a,这种场景是可以命中索引的。但是,b,c或c,b这种是不会命中索引的。
        3、如果组合索引存在范围查询,则组合索引可能会命中索引,这个跟B+Tree的叶子节点中存储的数据是否在当前的叶子节点中,即InnoDB存储引擎的最小存储单元——页,InnoDB页的大小默认是16k,可以通过参数查看页的默认大小:show global status like ‘innodb_page_size’;如果想要修改InnoDB页的大小,需要通过修改mysql源码才可以修改,找到源码文件(storage/innobase/include/univ.i),找到参数:UNIV_PAGE_SIZE,该参数必须是2的n次方,例如4k、8k、16k、32k、64k等等。
        4、order by 只能使用a,才能用到索引。

2.redis 
2.1Redis支持的数据类型?

    --String字符串:
    格式: set key value
    string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
    string类型是Redis最基本的数据类型,一个键最大能存储512MB。

    --Hash(哈希)
    格式: hmset name  key1 value1 key2 value2
    Redis hash 是一个键值(key=>value)对集合。
    Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

    --List(列表)
    Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
    格式: lpush  name  value
    在 key 对应 list 的头部添加字符串元素
    格式: rpush  name  value
    在 key 对应 list 的尾部添加字符串元素
    格式: lrem name  index
    key 对应 list 中删除 count 个和 value 相同的元素
    格式: llen name  
    返回 key 对应 list 的长度

    --Set(集合)
    格式: sadd  name  value
    Redis的Set是string类型的无序集合。
    集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

    --zset(sorted set:有序集合)
    格式: zadd  name score value
    Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
    不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
    zset的成员是唯一的,但分数(score)却可以重复。

2.2什么是Redis持久化?Redis有哪几种持久化方式?优缺点是什么?
    持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。
    Redis 提供了两种持久化方式:RDB(默认) 和AOF
    RDB:
    rdb是Redis DataBase缩写
    功能核心函数rdbSave(生成RDB文件)和rdbLoad(从文件加载内存)两个函数
    每当执行服务器(定时)任务或者函数时flushAppendOnlyFile 函数都会被调用, 这个函数执行以下两个工作
    aof写入保存:
    WRITE:根据条件,将 aof_buf 中的缓存写入到 AOF 文件
    SAVE:根据条件,调用 fsync 或 fdatasync 函数,将 AOF 文件保存到磁盘中。
    存储结构:
      内容是redis通讯协议(RESP )格式的命令文本存储。
    比较:
    1、aof文件比rdb更新频率高,优先使用aof还原数据。
    2、aof比rdb更安全也更大
    3、rdb性能比aof好
    4、如果两个都配了优先加载AOF
    (https://www.cnblogs.com/jasontec/p/9699242.html)

2.3提到redis通讯协议(RESP ),能解释下什么是RESP?有什么特点?

2.4 Redis 有哪些架构模式?讲讲各自的特点
    --单机版
    特点:简单
    问题:
    1、内存容量有限 2、处理能力有限 3、无法高可用。
    --主从复制
    Redis 的复制(replication)功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master),而通过复制创建出来的服务器复制品则为从服务器(slave)。 只要主从服务器之间的网络连接正常,主从服务器两者会具有相同的数据,主服务器就会一直将发生在自己身上的数据更新同步 给从服务器,从而一直保证主从服务器的数据相同。
    特点:
    1、master/slave 角色
    2、master/slave 数据相同
    3、降低 master 读压力在转交从库
    问题:
    无法保证高可用
    没有解决 master 写的压力
    --哨兵
    Redis sentinel 是一个分布式系统中监控 redis 主从服务器,并在主服务器下线时自动进行故障转移。其中三个特性
    监控(Monitoring):    Sentinel  会不断地检查你的主服务器和从服务器是否运作正常。
    提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
    自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作。
    特点:
    1、保证高可用
    2、监控各个节点
    3、自动故障迁移
    缺点:主从模式,切换需要时间丢数据
    没有解决 master 写的压力
    --集群(proxy 型):
    当部分master节点失败了,或者不能够和大多数节点通信的时候,为了保持可用,Redis集群用一个master-slave模式,这样的话每个hash slot就有1到N个副本。
    在我们的例子中,集群有A、B、C三个节点,如果节点B失败了,那么5501-11000之间的hash slot将无法提供服务。然而,当我们给每个master节点添加一个slave节点以后,我们的集群最终会变成由A、B、C三个master节点和A1、B1、C1三个slave节点组成,这个时候如果B失败了,系统仍然可用。节点B1是B的副本,如果B失败了,集群会将B1提升为新的master,从而继续提供服务。然而,如果B和B1同时失败了,那么整个集群将不可用
    Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。
    要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。因为我没有那么多服务器,也启动不了那么多虚拟机,所在这里搭建的是伪分布式集群,即一台服务器虚拟运行6个redis实例,修改端口号为(7001-7006),当然实际生产环境的Redis集群搭建和这里是一样的。

2.5使用过Redis分布式锁么,它是怎么实现的?
    --先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。

2.6如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?
    --set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的!

2.7使用过Redis做异步队列么,你是怎么用的?有什么缺点?
    一般使用list结构作为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试。
    缺点:
    在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如rabbitmq等。

2.8能不能生产一次消费多次呢?
    使用pub/sub主题订阅者模式,可以实现1:N的消息队列。

2.9什么是缓存穿透?如何避免?什么是缓存雪崩?何如避免?
    --缓存穿透
    一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。
    如何避免?
    1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。
    2:对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。
    --缓存雪崩
    当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力。导致系统崩溃。
    如何避免?
    1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
    2:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期
    3:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
    102. 是否使用过 Redis 集群,集群的原理是什么?
    Redis Sentinal 着眼于高可用,在 master 宕机时会自动将 slave 提升为 master,继续提供服务。
    Redis Cluster 着眼于扩展性,在单个 redis 内存不足时,使用 Cluster 进行分片存储。

3.数据大的如何优化?
    --减少对数据库的读取,也就是减少调用数据库,
    进行数据缓存,
    利用数据库的自身优化技术,如索引等
    精确查询条件,有利于提高查找速度

4.swoole https://www.php.cn/swoole/438164.html
1、swoole出现的意义是什么?
    解決php缺失的功能:swoole做为一种网络通信框架,解决php缺失的功能:比如多线程、异步通信、持久连接等
2、swoole的本质是什么?
    披着PHP外衣的C程序:其实就是c、java那些语言里面的高阶功能
    php所缺失的功能:swoole所提供的功能正是php所缺失的功能:比如多线程、异步通信、持久连接等
    异步网络通信引擎:面向生产环境的 PHP 异步网络通信引擎

    socket是系统提供的对tcp/ip操作的接口,swoole这是对socket在进行一个封装并提供php操作接口的php扩展。
    套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
    Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。 使用 PHP + Swoole 作为网络通信框架,可以使企业 IT 研发团队的效率大大提升。

5.MQ
1:为什么使用MQ?
    主要是:解耦、异步、削峰。
    (1)解耦:A 系统发送数据到 BCD 三个系统,通过接口调用发送。如果 E 系统也要这个数据呢?那如果 C 系统现在不需要了呢?A 系统负责人几乎崩溃......A 系统跟其它各种乱七八糟的系统严重耦合,A 系统产生一条比较关键的数据,很多系统都需要 A 系统将这个数据发送过来。如果使用 MQ,A 系统产生一条数据,发送到 MQ 里面去,哪个系统需要数据自己去 MQ 里面消费。如果新系统需要数据,直接从 MQ 里消费即可;如果某个系统不需要这条数据了,就取消对 MQ 消息的消费即可。这样下来,A 系统压根儿不需要去考虑要给谁发送数据,不需要维护这个代码,也不需要考虑人家是否调用成功、失败超时等情况。
    就是一个系统或者一个模块,调用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。但是其实这个调用是不需要直接同步调用接口的,如果用 MQ 给它异步化解耦。
    (2)异步:A 系统接收一个请求,需要在自己本地写库,还需要在 BCD 三个系统写库,自己本地写库要 3ms,BCD 三个系统分别写库要 300ms、450ms、200ms。最终请求总延时是 3 + 300 + 450 + 200 = 953ms,接近 1s,用户感觉搞个什么东西,慢死了慢死了。用户通过浏览器发起请求。如果使用 MQ,那么 A 系统连续发送 3 条消息到 MQ 队列中,假如耗时 5ms,A 系统从接受一个请求到返回响应给用户,总时长是 3 + 5 = 8ms。
    (3)削峰:减少高峰时期对服务器压力
    2:MQ优缺点 https://blog.csdn.net/lettyisme/article/details/85233008
    优点上面已经说了,就是在特殊场景下有其对应的好处,解耦、异步、削峰。
    缺点有以下几个:
    系统可用性降低
    系统引入的外部依赖越多,越容易挂掉。万一 MQ 挂了,MQ 一挂,整套系统崩溃,你不就完了?
    系统复杂度提高
    硬生生加个 MQ 进来,你怎么保证消息没有重复消费?怎么处理消息丢失的情况?怎么保证消息传递的顺序性?问题一大堆。
    一致性问题
    A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致了。

    Kafka 的定位主要在日志等方面,
    RabbitMQ 有三种模式:单机模式、普通集群模式、镜像集群模式。
    https://blog.csdn.net/lin123_00/article/details/108268424?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param


1.php 自动加载模式
    上述代码运作过程如下:

    1. 自定义 __autoload 函数,它定义了类文件的加载方式
    2. 当我们 new 一个 Book 实例时,它首先看当前是否包含了这个类,如果不存在则自动调用 __autoload 函数并将类名 Book 作为参数传递给这个函数。这实际上就是一种动态加载的方式,只有我们需要的类文件才会被加载。
    3. 找到 __autoload 函数后,发现定义好的加载动作 require DIR.$classname.'.class.php'; 这时候它就会去 DIR 目录下查找 Book.class.php 文件,如果存在这个文件则加载。
    4. 关于类 Book.class.php 的定义必须满足如下条件:类名和文件名一致;一个文件只定义一个类。
    Book.class.php 文件如下
    class Book {
      public function __construct() {
        echo "this is Book's construct\n";
      }
    }
    自动加载功能带来了几处优点:
    使用类之前无需 include 或者 require
    使用类的时候才会 require/include 文件,实现了 lazy loading,避免了 require/include 多余文件。、、

    无需考虑引入类的实际磁盘地址,实现了逻辑和实体文件的分离。

1.PHP静态方法与非静态方法在性能上有什么区别?
    --静态方法执行的性能比非静态方法快
    PHP静态方法和非静态方法的区别
    -- 声明类属性或方法为静态,就可以不实例化类而直接访问
    非静态方法可以调用静态方法或静态属性  而静态方法不可以调用非静态成员但可以调非静态方法(因为系统自动把非静态方法转化为静态方法) 
    类外调用静态方法时不需要实例化类也可以调用静态方法,可以直接类名调用静态方法名

2.垃圾回收机制

    开启垃圾回收机制后,针对内存泄露的情况,可以节省大量的内存空间,但是由于垃圾回收算法运行耗费时间,开启垃圾回收算法会增加脚本的执行时间。
    为了防止循环引用的变量引起的内存泄漏问题,在PHP中GC算法,当节点缓冲区满了之后,垃圾分析算法会启动,并且会释放掉发现的垃圾,从而回收内存

    PHP 5.3 版本之前都是采用引用计数的方式管理内存,PHP 所有的变量存在一个叫 zval 的变量容器中,当变量被引用的时候,引用计数会+1,变量引用计数变为0时,PHP 将在内存中销毁这个变量。
    但是引用计数中的循环引用,引用计数不会消减为 0,就会导致内存泄露。
    在 5.3 版本之后,做了这些优化:
    并不是每次引用计数减少时都进入回收周期,只有根缓冲区满额后在开始垃圾回收;
    可以解决循环引用问题;
    可以总将内存泄露保持在一个阈值以下。

    如何解决 PHP 内存溢出问题?
    增大 PHP 脚本的内存分配
    变量引用之后及时销毁
    将数据分批处理

    PHP可以自动进行内存管理,清除不再需要的对象。PHP使用了引用计数(reference counting)这种单纯的垃圾回收(garbage collection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。

3.防注入
    SQL 注入就是攻击者通过一些方式欺骗服务器,结果执行了一些不该被执行的 SQL。

    SQL 注入的常见场景
    数据库里被注入了大量的垃圾数据,导致服务器运行缓慢、崩溃。
    利用 SQL 注入暴露了应用程序的隐私数据

    防范措施:
    1.过滤特殊符号
    2.SQL语句书写时尽量不要省略小引号和单引号
    3.正确的使用 $_POST $_GET $_SESSION 等接受参数,并加以过滤
    4.对于常用方法加以封装,避免直接暴露 SQL语句
    5.使用pdo的预处理
    6.对隐私数据加密,禁止明文存储
    7.转义

    php:
    控制php脚本能访问的目录
    关闭危险函数
    关闭PHP版本信息在http头中的泄漏
    关闭注册全局变量
    函数addslashes()
    参考:https://www.cnblogs.com/liliuguang/p/10429163.html

4.占位符怎么占位
    占位符就字面意思(即占位用的),通过传入参数或设定参数取代所占用的位置,完成字符串的拼接

5.tp、的路由
    URL请求的执行流程:用户请求 -> 路由解析 -> 调度请求 -> 执行操作 -> 响应输出
    参考: https://blog.csdn.net/qq_39109805/article/details/95865045
    路由的解析
    1.路由检测:在当前获取路由的请求url的pathinfo信息
    2.导入路由配置文件,锁定路由检测,检测url绑定,解析url的url地址,记录当前的调度信息,记录路由和请求信息,调用分发,执行模块,初始化操作,反射到控制器内容

6.pdo
    1.PDO(PHP Data Object),PHP数据对象,有一个对象,它能够操作数据库中的数据,这个对象就是PDO。PDO是数据库抽象层的一种,可以使用PDO来操作常用的各个数据库(Mysql、SQL Server、oracle),写一套代码可以操作任何的数据库。
    2、为什么要使用PDO
    1、以前,使用单一的PHP扩展操作数据库,只能操作一种数据库
    2、可以操作任何数据库

7、使用PDO的好处
    1、一套代码可以操作任何数据库,换数据库的话,不用重写代码
    2、执行效率高,尤其是使用预处理。
    3、安全性高,特别是PDO中的预处理能够有效阻止SQL注入。
    4、在php5.5版本及以后版本中,mysql扩展被弃用了。只能使用mysqli或PDO代替。

8.CSRF 是什么?如何防范?
      CSRF(Cross-site request forgery)通常被叫做「跨站请求伪造」,可以这么理解:攻击者盗用用户身份,从而欺骗服务器,来完成攻击请求。

    防范措施:
    1.使用验证码
    2.给每一个请求添加令牌 token 并验证

9.XSS 是什么?如何防范?
    XSS(Cross Site Scripting),跨站脚本攻击,攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页之时,嵌入其中 Web 里面的 Script 代码会被执行,从而达到恶意攻击用户的目的。
    防止 XSS 攻击的方式有很多,其核心的本质是:
    永远不要相信用户的输入数据,始终保持对用户数据的过滤。

10.Cookie 和 Session 的区别和关系
    1.Cookie 在客户端(浏览器),Session 在服务器端。
    2.Session 比 Cookie 安全性更高。
    3.单个 Cookie 保存的数据不能超过 4K。
    4.Session 是基于 Cookie,如果浏览器禁用了 Cookie,Session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 Session ID)。

11.列举一些 PHP 中的设计模式?
    1.单例模式:保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个,同时这个类还必须提供一个访问该类的全局访问点。
        打印机接口
    2.工厂模式:定义一个创建对象的接口,但是让子类去实例化具体类。工厂方法模式让类的实例化延迟到子类中
        假设矩形、圆都有同样的一个方法,那么我们用基类提供的API来创建实例时,通过传参数来自动创建对应的类的实例,他们都有获取周长和面积的功能。

    3.观察者模式:观察者模式有时也被称作发布/订阅模式,该模式用于为对象实现发布/订阅功能:一旦主体对象状态发生改变,与之关联的观察者对象会收到通知,并进行相应操作。
        观察者模式(Observer),当一个对象状态发生变化时,依赖它的对象全部会收到通知,并自动更新。观察者模式实现了低耦合,非侵入式的通知与更新机制。
        一个事件发生后,要执行一连串更新操作

    4.适配器模式:适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
    5.注册模式:注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘的模式设计方法。
    6.策略模式:定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化。

12.PHP7 和 PHP5 的区别,具体多了哪些新特性?
    性能提升了两倍
    增加了结合比较运算符 (<=>)
    增加了标量类型声明、返回类型声明
    try...catch 增加多条件判断,更多 Error 错误可以进行异常处理
    增加了匿名类,现在支持通过new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义

13.为什么 PHP7 比 PHP5 性能提升了?
    变量存储字节减小,减少内存占用,提升变量操作速度
    改善数组结构,数组元素和 hash 映射表被分配在同一块内存里,降低了内存占用、提升了 cpu 缓存命中率
    改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率

14.Redis、Memecached 这两者有什么区别?
    1.Redis 支持更加丰富的数据存储类型,String、Hash、List、Set 和 Sorted Set。Memcached 仅支持简单的 key-value 结构。
    2.Memcached key-value存储比 Redis 采用 hash 结构来做 key-value 存储的内存利用率更高。
    3.Redis 提供了事务的功能,可以保证一系列命令的原子性
    4.Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,Memcached 只能存在内存中
    5.Redis 只使用单核,而 Memcached 可以使用多核,所以平均每一个核上 Redis 在存储小数据时比 Memcached 性能更高。

15.Redis 如何实现持久化?
    RDB 持久化,将 Redis 在内存中的的状态保存到硬盘中,相当于备份数据库状态。

    AOF 持久化(Append-Only-File),AOF 持久化是通过保存 Redis 服务器锁执行的写状态来记录数据库的。
    相当于备份数据库接收到的命令,所有被写入 AOF 的命令都是以 Redis 的协议格式来保存的。

16.什么是缓存穿透?如何避免?什么是缓存雪崩?何如避免?
    --缓存穿透
    一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。
    如何避免?
    1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。
    2:对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。

    --缓存雪崩
    当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力。导致系统崩溃。
    如何避免?
    1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
    2:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期
    3:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

17.数据库的优化?
    1.经常用到where活或on的条件字段 ,加上合适的索引
    2.使用合适的字段类型
    3.尽量避免使用子查询或者用函数,可以是使用左链接,右链接
    4.多使用limit
    5.使用慢查询日志,去分析sql执行时间,那个步骤慢了。
    6.复杂的sql可以拆分多条简单的sql执行
    7.查询时候多限制字段名输出,不要全列输出,输入需要的字段名就可以
    8.使用explain 分析单条sql
    9.可以使用 show profile,分析sql哪一步慢在哪里,花费在哪里 
    10.切分查询,减少服务器开销
    12.count(*),不要使用count(列名 )

    分析SQL语句方法
      1、使用explain或desc 分析单条SQL语句 
      列如:explain select * from  news;
      2、记录慢查询日志
      分析慢查询日志,不要直接打开慢查询日志进行分析,这样比较浪费时间和精力,可以使用pt-query-disgest工具分析。
      3、使用show  profile
      例如:set  profiling = 1;开启,服务器上执行的所有语句都会检测消耗的时间,存到临时表中
         show  profiles; 显示临时表
         show profile  for query id  查看单挑语句具体执行时间
      4、show  status
      show status 会返回一些计数器,show global status 查看服务器级别的所有计数。
      有时根据这些计数,可以猜测出那些操作代价较高或消耗时间多。
      5、show processlist
      观察是否右大量线程处于不正常的状态或者特征
    优化长难的查询语句
      一个复杂查询还是多个简单查询、
      MySQL内部每秒能扫描内存中上百万行数据,相比之下,响应数据给客户端就要慢的多
      使用尽可能少的查询是好的,但是有时将一个大的查询分解为多个小的查询是很有必要的
    切分查询
      将一个大的查询分为多个小的相同的查询
      一次性删除1000万的数据要比一次删除1万,暂停一会的方案更加损耗服务器开销

18.怎么设计接口规范?
   1.访问地址设计
   2.定好请求方式
   3.输入格式设计(后台接收参数的方式要统一)
   4.制定好输出结构
   5.规划好状态码
   6.验证过滤


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值