MySQL查询优化

    面试题一

      请简述项目中优化SQL语句执行效率的方法,从那些方面,SQL语句性能如何分析?

      优化查询过程中的数据访问、优化长难的查询语句、优化特定类型的查询语句

      分析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服务器是否在分析大量不必要的数据行

      避免使用如下SQL语句

      查询不需要的记录,使用limit解决

      多表关联返回全部列,指定返回需要的列

      总是取出全部列,select * 会让优化器无法完成索引覆盖扫描的优化

      重复查询相同的数据,可以把查询结果做缓存,下次从缓存中获取数据

      是否在扫描额外的记录?

      使用explain进行分析,如果发现查询需要扫描大量的数据但只返回少数的行,可以通过如下技巧去优化:

      使用索引覆盖扫描,把所有用的列都放到索引中,这样存储引擎不需要回表获取对应行就可以返回结果

      改变数据库和表的结构,修改数据库范式

      重写SQL语句,让优化器可以以更优的方式执行查询

      优化长难的查询语句

      一个复杂查询还是多个简单查询、

      MySQL内部每秒能扫描内存中上百万行数据,相比之下,响应数据给客户端就要慢的多

      使用尽可能少的查询是好的,但是有时将一个大的查询分解为多个小的查询是很有必要的

      切分查询

      将一个大的查询分为多个小的相同的查询

      一次性删除1000万的数据要比一次删除1万,暂停一会的方案更加损耗服务器开销

      分解关联查询

      可以将一条关联语句分解成多条SQL来执行

      让缓存的效率更高

      执行单个查询可以减少锁的竞争

      在应用层做关联可以更容易对数据库进行拆分

      特定类型的查询

      优化count()查询

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

      MyISAM中,没有任何where条件的count(*)非常快,当有where条件,MyISAM的count统计不一定比其他表引擎快

      优化方法

      可以使用explain查询近似值,用近似值替代count(*)

      增加汇总表 每次查询查询汇总表 , 汇总表使用缓存

      优化关联语句

      确定ON或者USING子句的列上有索引

      确保GROUP BY  和ORDER BY 中只有一个表中的列,这样MYSQL才有可能使用索引

      优化子查询

      使用关联查询替代

      优化group  by  和 distinct

      这两种查询均可使用索引来优化,是最有效的优化方法,关联查询中,使用标识列进行分组的效率会更高

      如果不需要order by ,进行group by 时使用 order by null ,MySQL不会再进行文件排序

      with rollup超级聚合,可以挪到应用程序处理

      优化limit分页

      limit偏移量大的时候,查询效率低

      可以记录上次查询的最大id,下次查询时直接根据该id查询

      优化union 查询

      union all  的效率高于union

PHP面试 MySQL查询优化的更多相关文章

  1. php面试专题---18、MySQL查询优化考点

    php面试专题---18.MySQL查询优化考点 一.总结 一句话总结: 慢查询:查找分析查询速度慢的原因 数据访问:优化查询过程中的数据访问 长难句:优化长难的查询语句 特定类型:优化特定类型的查询 ...

  2. Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析

    Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析     Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析1 存 ...

  3. MySQL查询优化之explain的深入解析

    在分析查询性能时,考虑EXPLAIN关键字同样很管用.EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作.以及MySQL成功返回结果集需要执行的行数.expla ...

  4. 1025WHERE执行顺序以及MySQL查询优化器

    转自http://blog.csdn.net/zhanyan_x/article/details/25294539 -- WHERE执行顺序-- 过滤比较多的放在前面,然后更加容易匹配,从左到右进行执 ...

  5. MySQL查询优化:查询慢原因和解决技巧

    在开发的朋友特别是和mysql有接触的朋友会碰到有时mysql查询很慢,当然我指的是大数据量百万千万级了,不是几十条了,下面我们来看看解决查询慢的办法. MySQL查询优化:查询慢原因和解决方法 会经 ...

  6. mysql查询优化器为什么可能会选择错误的执行计划

    有可能导致mysql优化器选择错误的执行计划的原因如下: A:统计信息不准确,mysql依赖存储引擎为其提供的统计信息来评估成本,然而有的存储引擎提供的信息是准确的,有的引擎提供的可能就偏差很大,如: ...

  7. Mysql查询优化器

    Mysql查询优化器 本文的目的主要是通过告诉大家,查询优化器为我们做了那些工作,我们怎么做,才能使查询优化器对我们的sql进行优化,以及启示我们sql语句怎么写,才能更有效率.那么到底mysql到底 ...

  8. MySQL查询优化 (一)

    以下的文章主要讲述的是MySQL查询优化的5个十分好用方法,熟悉SQL语句的人都清楚,如果要对一个任务进行操作的话,SQL语句可以有很多种相关写法,但是不同的写法查询的性能可能会有天壤之别. 本文列举 ...

  9. MySQL查询优化:连接查询排序limit

    MySQL查询优化:连接查询排序limit(join.order by.limit语句) 2013-02-27      个评论       收藏    我要投稿   MySQL查询优化:连接查询排序 ...

随机推荐

  1. spring cloud gateway 拦截request Body

    在接入Spring-Cloud-Gateway时,可能有需求进行缓存Json-Body数据或者Form-Urlencoded数据的情况. 由于Spring-Cloud-Gateway是以WebFlux ...

  2. (2).net体系

    一.C# 和CLR 和.Net Framework 的历史版本对照表 C#版本      CLR版本     Framework版本 1.0 1.0 1.0 1.2 1.1 1.1 2.0 2.0 2 ...

  3. 测开之路四十三:ajax请求

    ajax固定套路 function http(url, data, method, success, fail) { data = method == 'GET' ? data : JSON.stri ...

  4. 2.tensorflow——Softmax回归

    import numpy as np import tensorflow as tf import matplotlib.pyplot as plt from tensorflow.examples. ...

  5. 3.jmeter jsr232 脚本获取当前测试的正在活动的线程数

    jsr232 groovy 脚本获取当前测试的正在活动的线程数 (需要选择 groovy类型, 如果使用beanshell或者javascript,请根据其语法稍作修改即可) import org.a ...

  6. 不小心执行了 rm -f,先别急着跑路

    作者:justmine http://www.cnblogs.com/justmine/p/10359186.html 前言 每当我们在生产环境服务器上执行rm命令时,总是提心吊胆的,因为一不小心执行 ...

  7. Java-技术专区-如何监控Java线程池的状态

    线程池介绍 什么是线程池.线程池核心类.线程池工作流程.线程池分类.拒绝策略.及如何提交与关闭线程池等. 但在实际开发过程中,在线程池使用过程中可能会遇到各方面的故障,如线程池阻塞,无法提交新任务等. ...

  8. vue - blog开发学习6

    1.问题,如下图,使用iviewui中的card导致页面不能出现滚动条(不太会弄,在网上查了一个vue组件vuescroll,因此使用这个做滚动条) 2.安装vuescroll cnpm instal ...

  9. 二、spring的IoC

    IoC的基本认识 Inversion of Control:控制反转,就是将对象的创建权反转交给spring IoC的好处 传统方式的程序编写,底层的实现切换了,需要修改源代码 使用spring之后, ...

  10. java 自适应响应式 网站 源码 SSM 生成 静态化 手机 平板 PC 企业站源码

    前台: 支持四套模版, 可以在后台切换 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问 ...