WEB程序员需要掌握的十大MySQL优化技巧

2023-11-16

【51CTO独家特稿】WEB开发者不光要解决程序的效率问题,对数据库的快速访问和相应也是一个大问题。希望本文能对大家掌握MySQL优化技巧有所帮助。
1.优化你的MySQL查询缓存
在MySQL服务器上进行查询,可以启用高速查询缓存。让数据库引擎在后台悄悄的处理是提高性能的最有效方法之一。当同一个查询被执行多次时,如果结果是从缓存中提取,那是相当快的。
但主要的问题是,它是那么容易被隐藏起来以至于我们大多数程序员会忽略它。在有些处理任务中,我们实际上是可以阻止查询缓存工作的。
 
  
  1. // query cache does NOT work     
  2. $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");     
  3.     
  4. // query cache works!     
  5. $today = date("Y-m-d");     
  6. $r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");    
  7.  
  8. // query cache does NOT work 
  9. $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");  
  10.  
  11. // query cache works!  
  12. $today = date("Y-m-d");  
  13. $r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'"); 
2.用EXPLAIN使你的SELECT查询更加清晰
使用EXPLAIN关键字是另一个MySQL优化技巧,可以让你了解MySQL正在进行什么样的查询操作,这可以帮助你发现瓶颈的所在,并显示出查询或表结构在哪里出了问题。
EXPLAIN查询的结果,可以告诉你那些索引正在被引用,表是如何被扫描和排序的等等。
实现一个SELECT查询(最好是比较复杂的一个,带joins方式的),在里面添加上你的关键词解释,在这里我们可以使用phpMyAdmin,他会告诉你表中的结果。举例来说,假如当我在执行joins时,正忘记往一个索引中添加列,EXPLAIN能帮助我找到问题的所在。
添加索引到group_id field后
添加之后
3.利用LIMIT 1取得唯一行
有时,当你要查询一张表是,你知道自己只需要看一行。你可能会去的一条十分独特的记录,或者只是刚好检查了任何存在的记录数,他们都满足了你的WHERE子句。
在这种情况下,增加一个LIMIT 1会令你的查询更加有效。这样数据库引擎发现只有1后将停止扫描,而不是去扫描整个表或索引。、
 
      
  1. // do I have any users from Alabama?     
  2. // what NOT to do:     
  3. $r = mysql_query("SELECT * FROM user WHERE state = 'Alabama'");     
  4. if (mysql_num_rows($r) > 0) {     
  5.     // ...     
  6. }       
  7. // much better:     
  8. $r = mysql_query("SELECT 1 FROM user WHERE state = 'Alabama' LIMIT 1");     
  9. if (mysql_num_rows($r) > 0) {     
  10.     // ...     
  11. }   
4. 索引中的检索字段
索引不仅是主键或唯一键。如果你想搜索表中的任何列,你应该一直指向索引。
索引中的检索字段 
5.保证连接的索引是相同的类型
如果应用程序中包含多个连接查询,你需要确保你链接的列在两边的表上都被索引。这会影响MySQL如何优化内部联接操作。
此外,加入的列,必须是同一类型。例如,你加入一个DECIMAL列,而同时加入另一个表中的int列,MySQL将无法使用其中至少一个指标。即使字符编码必须同为字符串类型。
 
          
  1. // looking for companies in my state     
  2. $r = mysql_query("SELECT company_name FROM users    
  3.     LEFT JOIN companies ON (users.state = companies.state)    
  4.     WHERE users.id = $user_id");     
  5.     
  6. // both state columns should be indexed     
  7. // and they both should be the same type and character encoding     
  8. // or MySQL might do full table scans 
6.不要使用BY RAND()命令
这是一个令很多新手程序员会掉进去的陷阱。你可能不知不觉中制造了一个可怕的平静。这个陷阱在你是用BY RAND()命令时就开始创建了。
如果您真的需要随机显示你的结果,有很多更好的途径去实现。诚然这需要写更多的代码,但是能避免性能瓶颈的出现。问题在于,MySQL可能会为表中每一个独立的行执行BY RAND()命令(这会消耗处理器的处理能力),然后给你仅仅返回一行。
 
            
  1. // what NOT to do:     
  2. $r = mysql_query("SELECT username FROM user ORDER BY RAND() LIMIT 1");     
  3. // much better:     
  4. $r = mysql_query("SELECT count(*) FROM user");     
  5. $d = mysql_fetch_row($r);     
  6. $rand = mt_rand(0,$d[0] - 1);     
  7.     
  8. $r = mysql_query("SELECT username FROM user LIMIT $rand, 1");   
7.尽量避免SELECT *命令
从表中读取越多的数据,查询会变得更慢。他增加了磁盘需要操作的时间,还是在数据库服务器与WEB服务器是独立分开的情况下。你将会经历非常漫长的网络延迟,仅仅是因为数据不必要的在服务器之间传输。
始终指定你需要的列,这是一个非常良好的习惯。
 
               
  1. // not preferred     
  2. $r = mysql_query("SELECT * FROM user WHERE user_id = 1");     
  3. $d = mysql_fetch_assoc($r);     
  4. echo "Welcome {$d['username']}";     
  5. // better:     
  6. $r = mysql_query("SELECT username FROM user WHERE user_id = 1");     
  7. $d = mysql_fetch_assoc($r);     
  8. echo "Welcome {$d['username']}";      
  9. // the differences are more significant with bigger result sets   
8.从PROCEDURE ANALYSE()中获得建议
PROCEDURE ANALYSE()可让MySQL的柱结构分析和表中的实际数据来给你一些建议。如果你的表中已经存在实际数据了,能为你的重大决策服务。
MySQL的柱结构 
9.准备好的语句
准备好的语句,可以从性能优化和安全两方面对大家有所帮助。
准备好的语句在过滤已经绑定的变量默认情况下,能给应用程序以有效的保护,防止SQL注入***。当然你也可以手动过滤,不过由于大多数程序员健忘的性格,很难达到效果。
 
                   
  1. // create a prepared statement     
  2. if ($stmt = $mysqli->prepare("SELECT username FROM user WHERE state=?")) {      
  3.     // bind parameters     
  4.     $stmt->bind_param("s", $state);      
  5.     // execute     
  6.     $stmt->execute();      
  7.     // bind result variables     
  8.     $stmt->bind_result($username);       
  9.     // fetch value     
  10.     $stmt->fetch();      
  11.     printf("%s is from %s\n", $username, $state);       
  12.     $stmt->close();     
  13. }   
10.将IP地址存储为无符号整型
许多程序员在创建一个VARCHAR(15)时并没有意识到他们可以将IP地址以整数形式来存储。当你有一个INT类型时,你只占用4个字节的空间,这是一个固定大小的领域。
你必须确定你所操作的列是一个UNSIGNED INT类型的,因为IP地址将使用32位unsigned integer。
 
                     
  1. $r = "UPDATE users SET ip = INET_ATON('{$_SERVER['REMOTE_ADDR']}') WHERE user_id = $user_id";  
十大MySQL优化技巧就介绍到这里。
英文原文标题:Top 20+ MySQL Best Practices
链接: http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/
【编辑推荐】
  1. MySQL数据库性能优化的关键参数
  2. 优化MySQL插入方法的五个妙招
  3. MySQL数据库性能优化的关键参数
  4. 优化MySQL数据库性能的八大妙招
  5. 三种优化MySQL数据库查询的方法简介
©著作权归作者所有:来自51CTO博客作者patton526的原创作品,如需转载,请注明出处,否则将追究法律责任

0

分享

收藏

patton526

44篇文章,11W+人气,0粉丝

Ctrl+Enter 发布

发布

取消

推荐专栏更多

79d1700ce8f618bd9a42ddf02bfd8ddc.jpg
十年老兵教你练一套正宗的MySQL降龙十八掌

MySQL全通晓

共18章 | 张甦
¥51.00 402人订阅
629650e188ddde78b213e564c2e9ebff.jpg
负载均衡高手炼成记

高并发架构之路

共15章 | sery
¥51.00 507人订阅

猜你喜欢

十二年一轮回,写于18年软考高项通过之后 我的友情链接 nginx反向代理配置及优化 Mysql启报错报The server quit without updating PID file mysql主从复制(超简单) 数据库设计(一)——数据库设计 Mysql支持的数据类型(总结) 实战Nginx与PHP(FastCGI)的安装、配置与优化 《灰鸽子VIP帐号密码邮箱数据库》 亿级 Elasticsearch 性能优化 Mysql数据库的使用总结之ERROR 1146 (42S02) 大数据采集、清洗、处理:使用MapReduce进行离线数据分析完整案例 PostgreSQL的B-tree索引 PostgreSQL pg_rewind实例--could not find previous WA redis geo 地理位置系应用战案例 PostgreSQL逻辑备份pg_dump使用及其原理解析 PostgreSQL如何删除不使用的xlog文件 PostgreSQL pg_ctl start超时分析 Greenplum -- segment 死机后恢复 postgresql 主备及切换-恢复方案
left-qr.jpg

扫一扫,领取大礼包

0

1
分享
patton526

转载于:https://blog.51cto.com/shigemao/235512

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WEB程序员需要掌握的十大MySQL优化技巧 的相关文章

  • 纠正装饰器模式的一个大缺点

    不久前 我在重构一些游戏战斗代码时决定尝试装饰器模式 战斗者可以拥有各种被动能力 也可能是不同类型的生物 我认为装饰器可以让我在运行时以各种组合添加行为 因此我不需要数百个子类 我几乎已经完成了 15 个左右的被动能力装饰器 在测试中我发现
  • 让登录更安全

    我已使用此代码进行管理员登录 仅当用户输入正确的用户名和密码时才应打开loginhome php 但后来我意识到这根本不安全 任何人都可以直接访问 mywebsite loginhome php 而无需登录 注销后 可以使用后退按钮打开 l
  • 单词之间没有空格的语言(例如亚洲语言)中的断词?

    我想让 MySQL 全文搜索适用于日语和中文文本以及任何其他语言 问题在于这些语言以及可能其他语言通常在单词之间没有空格 当您必须键入与文本中相同的句子时 搜索没有用 我不能只在每个字符之间添加空格 因为英语也必须有效 我想用 PHP 或
  • 如何解压 PHP/Lumen/Laravel 的 gzip 请求?

    我收到来自第三方的 gzip 编码文本请求 1mb 所以这是有道理的 我的测试路线 router gt post testgzip function Illuminate Http Request request decompressed
  • PHP 会话不适用于游戏

    我正在尝试模仿一款名为 SKUNK 用骰子玩 的游戏来完成一项作业 我无法让会话正常工作 这是我第一次使用 PHP 我还被告知无需会议即可完成 这是我的代码
  • Yii 使用 ajax 进行分页

    我需要使用ajax启用分页 我的代码 控制器 更新内容ajax function actionIndex dataProvider new CActiveDataProvider News array pagination gt array
  • preg_match_all 查询仅显示有问题的外部组

    我无法弄清楚如何只显示 preg 查询的外部组级别 我会给你一个例子 preg match all start end input matches 这个输入start1 start2 2end 1end产生这个输出start1 start2
  • “使用未定义常量”注意,但该常量应该被定义

    共有三个文件 common php controller php 和 user php 文件 common php 如下所示 文件controller php看起来像 文件 user php 如下所示 执行脚本时 会给出通知 注意 使用未定
  • 使用 SSL 证书验证 Web 浏览器

    是否可以使用 ssl 证书对 Web 浏览器进行身份验证 假设我在应用程序中存储私钥 有什么方法可以从浏览器读取密钥并尝试基于该私钥进行身份验证 您可以使用 SSL TLS 客户端证书身份验证来对浏览器 用户进行身份验证 服务器必须请求客户
  • 在 PHP 中使用 phpseclib 时出现 RSA 问题

    我正在尝试在 phpseclib 中使用 RSA 实现 我认为在函数中执行一次代码并重新使用该函数会更容易 当我尝试向代码发送短信时 我收到一条错误消息 提示 解密错误 测试还让我意识到每次代码运行时密文都是不同的 所以我显然在那里做错了什
  • 在 Wordpress 站点中进行 AJAX 调用时出现问题

    我在使用 Wordpress 站点功能的 AJAX 部分时遇到了一些问题 该功能接受在表单上输入的邮政编码 使用 PHP 函数来查找邮政编码是否引用特定位置并返回到该位置的永久链接 我的第一个问题是关于我构建的表单 现在我的表单操作是空白的
  • 通过 $_SESSION 从一个脚本发送到另一个脚本期间数据丢失

    我正在尝试将一个充满属性的对象从一个 PHP 发送到另一个 PHP SESSION object obj where obj是一个用 foreach 循环指定的对象 foreach array of objects as obj SESSI
  • 在 apache docker 容器中运行虚拟主机

    我在同一个 apache 容器中有两个 php 应用程序 我试图在端口上运行其中一个应用程序 因为它需要通过根域而不是子文件夹进行访问 我想在端口 8060 上运行应用程序 我尝试使用 apache 虚拟主机执行此操作 但它不会加载页面 h
  • 跟踪用户何时点击浏览器上的后退按钮

    是否可以检测用户何时单击浏览器的后退按钮 我有一个 Ajax 应用程序 如果我可以检测到用户何时单击后退按钮 我可以显示适当的数据 任何使用 PHP JavaScript 的解决方案都是优选的 任何语言的解决方案都可以 只需要我可以翻译成
  • PHP HEREDoc (EOF) 语法在 Sublime Text 3 上突出显示与正斜杠的差异

    我不熟悉 Sublime Text 3 如何使用语法突出显示 例如 如果它纯粹依赖于主题 或者它内置于主题运行的标准中 但就我而言 使用 PHP 的 HERE 文档和转发存在一些语法突出显示差异斜线 一旦出现正斜杠 ST3 就会认为以下所有
  • php 错误 fopen(): 文件名不能为空

    发送带有附件代码的电子邮件工作正常 最近我们已将文件传输到另一个托管服务器 idk 发生了什么 它显示以下错误 警告 fopen 第 106 行 home hugerecruitmetnt public html validatecva p
  • 如何在 PHP 中从 IP 地址/国家/地区名称查找时区 ID?

    谁能告诉我 PHP 中是否有任何方法可以从 IP 地址或国家 地区名称获取时区区域 例如 亚洲 加尔各答 描述 我正在尝试根据他 她的国家 地区设置用户时区 我从他的 IP 地址获取用户所在国家 地区 但我需要该国家 地区的时区区域 例如
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主
  • 使用正则表达式提取两个短语之间的所有单词[重复]

    这个问题在这里已经有答案了 我正在尝试使用以下正则表达式提取两个短语之间的所有单词 b item W w W 0 2 1 one W w W 0 3 business b b item W w W 0 2 3 three W w W 0 3
  • 如何在 Laravel 中使用 PUT http 动词提交表单

    我知道这个问题可能已经提出 但我就是无法让它发挥作用 如果有人可以帮助我 我将非常感激 我安装了 colletive form 但答案也可以是 html 表单标签 现在列出我的表格 我的路线和我的例外情况 Form model array

随机推荐

  • 史上最快的实例分割SparseInst Int8量化实录

    近期 YOLOv7里面借鉴 复 制 粘 贴 了一个新的模型 SparseInst 我借助YOLOv7的基建能力 将其导出到了ONNX 获得了一个非常不错的可以直接用OnnxRuntime 或者TensorRT跑的实例分割 后续也可能把lin
  • 数据挖掘十大算法

    参考 ICDM 数据挖掘十大算法
  • flutter 去除超出警报

    给超出内容套上SingleChildScrollView组件即可 SingleChildScrollView child
  • wpf datagrid自动生成列时特殊字符转换

    DataGrid控件可以根据DataTable自动生成行和列 但是如果列名包括一些特殊字符 的时候 会出现无法显示出数据或者显示DataRowView的情况 原因是这些字符是Xaml里用来标识绑定path和xpath的符号 例如我们会这么用
  • C语言补漏:字符串指针与字符数组传参

    字符串指针与字符数组传参 深信服的笔试上被吊打 其中对一道用指针做形参的题目印象十分深刻 借此恶补了一晚上指针 今天总结 以作警示 试想有如下情形 将一个字符串指针做形参赋值函数修改其字符串 函数结束后字符串被改变了吗 include
  • 快速上手Gobject

    转自 http blog csdn net acs713 article details 7778051 What is G object 很多人被灌输了这样一种概念 要写面向对象程序 那么就需要学习一种面向对象编程语言 例如C Java
  • chrome扩展开发调试

    chrome扩展由content scripts browser actions background等多个部分组成 其中 content scripts属于注入web页面 所以在contentscripts中的console log会被正
  • Uncaught TypeError: AMap.MarkerClusterer is not a constructor

    实验点聚合时报错 cluster new AMap MarkerClusterer map markers styles sts gridSize 80 改为 map plugin AMap MarkerClusterer function
  • SQL语法基础

    SQL语法基础 SQL语法基础 SQL 是用于访问和处理数据库的标准的计算机语言 SQL 语句 需要在数据库上执行的大部分工作都由 SQL 语句完成 tips SQL 对大小写不敏感 SELECT 与 select 是相同的 一些最重要的
  • 【每周一个编程技巧 - Java笔记】玩转SSM:SpringBoot+Mybatis多条件筛选

    SpringBoot Mybatis多条件筛选 在实际的业务开发系统中 做的最多的工作就是增 删 改 查操作 而这部分增 删 改 查的操作中又有80 的都是查询操作 本文记录的主要内容是 基于SpringBoot和Mybatis来实现条件查
  • tesseract-orc编译及使用(WINDOWS VS 2019)

    1 准备资源 Vs2010或者更高版本 本教程使用vs2019 1 1Tesseract源码 分支切换到3 04 看到vs2010 git地址https github com tesseract ocr tesseract下载源码 文件夹并
  • 关于 Demo_Ocean 例子的分析

    关于 Demo Ocean 例子的分析 重要总结 1 该例主要类不再继承自ExampleApplication和ExampleFrameListener 重写驱动类和监听类 2 如何创建OIS的输入系统 1 创建OIS ParamList
  • Arduino与人体感应模块

    工具 1 Arduino 开发板 1 2 人体感应模块传感器 1 这个人体感应传感器有三个引脚 分别是VCC OUT GND 同之前的红外线传感器一样输出的是数字信号 所以要将OUT接入digital pwm引脚 这里我接入3号引脚 下面是
  • sql排序,数据库字段设置为varchar导致排序失效

    一般情况下 我们在表设置排序字段都是int 对应的sql查询 也就只需要order by xx desc 但是总有一些老项目 由于会因为各种原因 导致出现此字段为varchar情况 这种情况我们应该怎么排序呢 ex g Ex state 0
  • 1、shell 基础进阶系列文章

    shell 基础进阶系列文章 目录 第一章 shell本质 第二章 shell2 第三章 shell3 第一章 shell认知 shell 基础进阶系列文章 前言 一 shell基础 1 shell脚本的本质 2 shell编译的基本步骤
  • zabbix监控数据转存与处理

    zabbix是一个基于WEB页面的分布式系统监控方案 能够监控各类资产并提供灵活的通知功能 同时能够运行在各种流行系统中 zabbix分为zabbix server和zabbix agent端 zabbix server可以单独远程监控服务
  • 美图全链路监控实战

    一 摘要 本文内容分为3部分 首先简单介绍了美图的业务背景和监控体系 然后是两个美图的监控实践 基于Grafana FlowCharting插件的 监控大盘 实战和基于基于GrafanaImageRender 企业微信机器人的 图文告警 实
  • JS 12——内置对象Math的方法

    1 Math 是一个内置对象 不是一个函数对象 2 Math 作为内置对象 拥有一些数学常数属性和数学函数方法 3 如果Math 用于 Number 类型 它不支持 BigInt 4 Math 的所有属性是静态的 Math方法也全部都是静态
  • 在AndroidStudio中如何查看Gradle的版本

    以Android Studio Giraffe 2022 3 1为例 File gt Project Structure gt Project Android Gradle Plugin Version Android Gradle插件版本
  • WEB程序员需要掌握的十大MySQL优化技巧

    51CTO独家特稿 WEB开发者不光要解决程序的效率问题 对数据库的快速访问和相应也是一个大问题 希望本文能对大家掌握MySQL优化技巧有所帮助 1 优化你的MySQL查询缓存 在MySQL服务器上进行查询 可以启用高速查询缓存 让数据库引