优化MySQL数据库中的查询语句详解
作者:shichen2014 发布时间:2024-01-21 06:17:06
很多时候基于php+MySQL建立的网站所出现的系统性能瓶颈往往是出在MySQL上,而MySQL中用的最多的语句就是查询语句,因此,针对MySQL数据库查询语句的优化就显得至关重要!本文就此问题做出详细分析如下:
1、判断是否向MySQL数据库请求了不需要的数据,如下列情况:
(1)、查询不需要的数据,例如你需要10条数据,但是你选出了100条数据加了limit做限制。
(2)、多表关联时返回全部列
(3)、总是取出全部列select*......取出全部列,会让优化器无法完成索引覆盖扫描这类优化,还为服务器带来额外的I/O、内存、和cpu的消耗
(4)、重复查询相同的数据例如,在用户评论的地方需要查询用户的头像的URL,那么用户多次评论的时候将这个数据缓存起来,需要的时候从缓存取出,这样性能会更好。
2、mysql是否在扫描额外的记录
最简单衡量查询开销的三个指标如下:响应时间、扫描的行数、返回的行数
响应时间:服务时间和排队时间。服务时间是指数据库处理这个查询真正花费的时间。排队时间是指服务器因为等待某些资源而没有真正执行的查询。
扫描的行数和返回的行数:理想情况下扫描的行数和返回的行数应该是相同的。
一般MYSQL能够使用如下三种方式应用where条件记录,从好到坏依次为:
(1)、在索引中使用where条件来过滤不匹配的记录,在存储索引层完成。
(2)、使用索引覆盖扫描来返回记录,直接从索引中过滤不需要的记录并返回命中的结果,在mysql服务器层完成,但无需在回表查询记录。
(3)、从数据表中返回数据,然后过滤不满足条件的记录,在mysql服务器层完成,需要先从数据表读出记录然后过滤
如果发现查询需要扫描大量的数据但返回少数的行,那么通常可以尝试下面的技巧:
(1)、使用索引覆盖扫描,把所有需要的列都放到索引中,这样存储引擎无须返回表获取对应行就可以返回结果了。
(2)、改变库表结构,使用单独的汇总表。
(3)、重写这个复杂的查询
3、重构查询的方式
(1)、一个复杂查询还是多个简单查询:
Mysql内部每秒能够扫描内存中上百万条数据,相比之下,mysql响应数据给客户端就慢得多,在其他条件都相同的时候,使用尽可能少的查询当然是好的,但有时候将一个大查询分解为多个小查询都是很有必要的。
(2)、切分查询:
删除旧数据是一个很好的例子,在定期清除大量数据时,如果用一个大的语句一次性完成的话,则可能一次锁住很多数据,占满整个事物日志。耗尽系统资源,阻塞很多小的但很重要的查询。
Mysql>deletefrommessageswherecreated<DATE_SUB(NOW(),INTERVAL3MONTH);
改写:
Rows_affected=0;
Do{
Rows_affected=do_query(
“deletefrommessageswherecreated<DATE_SUB(NOW(),INTERVAL3MONTH)”;
)
}
(3)、分解关联查询:
可以让缓存的效率更高,在应用程序中可以方便的缓存单条数据
就查询分解后,执行单个查询可以减少锁的竞争
在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和高扩展
查询本身效率也会更高。
可以减少冗余数据的查询,在应用层做关联查询,意味着对于某条数据应用只需要查询一次,而在数据库中做查询,可能需要重复的访问一部分数据。
适合场景:
①当应用程序能够方便的缓存单个查询结果的时候;
②当可以将数据分布到不同的mysql服务器上的时候;
③当能够使用IN()的方式代替关联查询的时候;
④当查询中使用一个数据表的时候。


猜你喜欢
- [1]定义:正则又叫规则或模式,是一个强大的字符串匹配工具,在javascript中是一个对象[2]特性:[2.1]贪婪性,匹配最长的[2.
- 本文主要研究的是Python编程删除服务器文件,具体实现 代码如下。实例1#coding:utf-8import paramiko"
- 本文用python实现线性回归算法,供大家参考,具体内容如下# -*- coding: utf-8 -*-"""
- 本文实例讲述了js控制div弹出层实现方法。分享给大家供大家参考。具体分析如下:这是个功能很好,且容易调用和控制的弹出层。感兴趣的朋友可以调
- vue-router路由懒加载 和权限控制,今天刚好搞了一个基于node token验证的小demo所以下面介绍下,路由懒加载1、为什么要使
- 需求分析项目上需要用到手机号前7位,判断号码是否合法,还有归属地查询。旧的数据是几年前了太久了,打算用python爬虫重新爬一份单线程版本#
- Background高斯噪声,顾名思义是指服从高斯分布(正态分布)的一类噪声。有的时候我们需要向标准数据中加入合适的高斯噪声让数据更加符合实
- 本文实例讲述了Python使用pymysql模块操作mysql增删改查。分享给大家供大家参考,具体如下:# -*- coding:utf-8
- 使用setStyleSheet方法修改得到自己想要的字体,大小,颜色self.lab = QLabel("标签字体大小颜色&quo
- 一、oracle oracle服务器有Oracle instace 和Oracle database instance有memory str
- 1、信息表新建立一个字段,并用0、1的方法判断信息的状态。 2、新建一个页面,定时刷新,并查询表中是否有字段值为0的记录。 3、当管理员点击
- 简介Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。你可以将它理解成脚本语言,大多情况我也是将它作为写脚本工具
- PHP asXML()函数实例格式化 XML(版本 1.0)中的 SimpleXML 对象的数据:<?php $note=<&l
- 用采集程序的优点有:无须维护网站,因为采集程序中的数据来自其他网站,它将随着该网站的更新而更新;可以节省服务器资源,一般采集程序就几个文件,
- 有过相关经验的朋友都知道,Jscript的效率毕竟有限,在数组中查找数据时如果用常规的算法来做执行起来会很慢。例如在一个含500个字符串的d
- 今天遇到多条件搜索,其中需要用到in查询,但是laravel不支持 [ 'type', 'in', '
- 最近重温了一下位图分割的相关内容,发现网络上位图分割原理讲得已经很清楚了,但是代码多为C++实现或者Matlab实现,因为需要Python的
- udf_WeekDayName 代码如下:CREATE FUNCTION [dbo].[udf_WeekDayName] ( ) RETUR
- 1、出现错误train_df = pd.read_csv( 'C:\Users\lenovo\Desktop\train.csv
- 在数据分析中有时候需要自己定义分组规则 这里简单介绍一下用一个字典实现分组people=DataFrame( np.random