首页 数据库 mysql教程 MySQL优化全攻略--相关数据库命令_MySQL

MySQL优化全攻略--相关数据库命令_MySQL

Jun 01, 2016 pm 02:11 PM
mysql 优化 全攻略 命令 数据库 相关

MySQL优化


  ▲ SHOW
  
  执行下面这个命令可以了解服务器的运行状态:
  
  mysql >show status;
  
  该命令将显示出一长列状态变量及其对应的值,其中包括:被中止访问的用户数量,被中止的连接数量,尝试连接的次数,并发连接数量最大值,以及其他许多有用的信息。这些信息对于确定系统问题和效率低下的原因是十分有用的。
  
  SHOW命令除了能够显示出MySQL服务器整体状态信息之外,它还能够显示出有关日志文件、指定数据库、表、索引、进程和许可权限表的宝贵信息。请访问http://www.mysql.com/doc/S/H/SHOW.html了解更多信息。
  
  ▲ EXPLAIN
  
  EXPLAIN能够分析SELECT命令的处理过程。这不仅对于决定是否要为表加上索引很有用,而且对于了解MySQL处理复杂连接的过程也很有用。
  
  下面这个例子显示了如何用EXPLAIN提供的信息逐步地优化连接查询。(本例来自MySQL文档,见http://www.mysql.com/doc/E/X/EXPLAIN.html。原文写到这里似乎有点潦草了事,特加上此例。)
  
  假定用EXPLAIN分析的SELECT命令如下所示:
  
  EXPLAIN SELECT tt.TicketNumber, tt.TimeIn,
  tt.ProjectReference, tt.EstimatedShipDate,
  tt.ActualShipDate, tt.ClientID,
  tt.ServiceCodes, tt.RepetitiveID,
  tt.CurrentProcess, tt.CurrentDPPerson,
  tt.RecordVolume, tt.DPPrinted, et.COUNTRY,
  et_1.COUNTRY, do.CUSTNAME
  FROM tt, et, et AS et_1, do
  WHERE tt.SubmitTime IS NULL
  AND tt.ActualPC = et.EMPLOYID
  AND tt.AssignedPC = et_1.EMPLOYID
  AND tt.ClientID = do.CUSTNMBR;
  
  SELECT命令中出现的表定义如下:
  
  ※表定义
  
  表 列 列类型
  tt ActualPC CHAR(10)
  tt AssignedPC CHAR(10)
  tt ClientID CHAR(10)
  et EMPLOYID CHAR(15)
  do CUSTNMBR CHAR(15)
  
  ※索引
  
  表 索引
  tt ActualPC
  tt AssignedPC
  tt ClientID
  et EMPLOYID (主键)
  do CUSTNMBR (主键)
  
  ※tt.ActualPC值分布不均匀
  
  在进行任何优化之前,EXPLAIN对SELECT执行分析的结果如下:
  
  table type possible_keys    key key_len ref rows Extra
  et ALL PRIMARY      NULL NULL NULL 74
  do ALL PRIMARY      NULL NULL NULL 2135
  et_1 ALL PRIMARY      NULL NULL NULL 74
  tt ALL AssignedPC,ClientID,ActualPC NULL NULL NULL 3872
  range checked for each record (key map: 35)
  
  每一个表的type都是ALL,它表明MySQL为每一个表进行了完全连接!这个操作是相当耗时的,因为待处理行的数量达到每一个表行数的乘积!即,这里的总处理行数为74 * 2135 * 74 * 3872 = 45,268,558,720。
  
  这里的问题之一在于,如果数据库列的声明不同,MySQL(还)不能有效地运用列的索引。在这个问题上,VARCHAR和CHAR是一样的,除非它们声明的长度不同。由于tt.ActualPC声明为CHAR(10),而et.EMPLOYID声明为CHAR(15),因此这里存在列长度不匹配问题。
  
  为了解决这两个列的长度不匹配问题,用ALTER TABLE命令把ActualPC列从10个字符扩展到15字符,如下所示:
  
  mysql > ALTER TABLE tt MODIFY ActualPC VARCHAR(15);
  
  现在tt.ActualPC和et.EMPLOYID都是VARCHAR(15)了,执行EXPLAIN进行分析得到的结果如下所示:
  
  table type possible_keys key  key_len ref   rows Extra
  tt ALL AssignedPC,ClientID,ActualPC NULL NULL NULL 3872 where used
  do ALL PRIMARY   NULL NULL NULL  2135
  range checked for each record (key map: 1)
  et_1 ALL PRIMARY   NULL NULL NULL  74
  range checked for each record (key map: 1)
  
  et eq_ref PRIMARY   PRIMARY 15  tt.ActualPC 1
  
  这还算不上完美,但已经好多了(行数的乘积现在少了一个系数74)。现在这个SQL命令执行大概需要数秒钟时间。
  
  为了避免tt.AssignedPC = et_1.EMPLOYID以及tt.ClientID = do.CUSTNMBR比较中的列长度不匹配,我们可以进行如下改动:
  
  mysql > ALTER TABLE tt MODIFY AssignedPC VARCHAR(15),
  MODIFY ClientID VARCHAR(15);
  
  现在EXPLAIN显示的结果如下:
  
  table type possible_keys key  key_len ref   rows  Extra
  et ALL PRIMARY   NULL NULL NULL   74
  tt ref AssignedPC,ClientID,ActualPC ActualPC 15 et.EMPLOYID 52 where used
  et_1 eq_ref PRIMARY   PRIMARY 15  tt.AssignedPC 1
  do eq_ref PRIMARY   PRIMARY 15  tt.ClientID 1
  
  这个结果已经比较令人满意了。
  
  余下的问题在于,默认情况下,MySQL假定tt.ActualPC列的值均匀分布,而事实上tt表的情况并非如此。幸而,我们可以很容易地让MySQL知道这一点:
  
  shell > myisamchk --analyze PATH_TO_MYSQL_DATABASE/tt
  shell > mysqladmin refresh
  
  现在这个连接操作已经非常理想,EXPLAIN分析的结果如下:
  
  table type possible_keys key  key_len ref   rows Extra
  tt ALL AssignedPC,ClientID,ActualPC NULL NULL NULL 3872 where used
  et eq_ref PRIMARY   PRIMARY 15  tt.ActualPC 1
  et_1 eq_ref PRIMARY   PRIMARY 15  tt.AssignedPC 1
  do eq_ref PRIMARY   PRIMARY 15  tt.ClientID 1
  
  ▲ OPTIMIZE
  
  OPTIMIZE能够恢复和整理磁盘空间以及数据碎片,一旦对包含变长行的表进行了大量的更新或者删除,进行这个操作就非常有必要了。OPTIMIZE当前只能用于MyISAM和BDB表。
  
  结束语:
  
  从编译数据库服务器开始、贯穿整个管理过程,能够改善MySQL性能的因素实在非常多,本文只涉及了其中很小的一部分。
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

phpmyadmin怎么打开 phpmyadmin怎么打开 Apr 10, 2025 pm 10:51 PM

可以通过以下步骤打开 phpMyAdmin:1. 登录网站控制面板;2. 找到并点击 phpMyAdmin 图标;3. 输入 MySQL 凭据;4. 点击 "登录"。

MySQL:世界上最受欢迎的数据库的简介 MySQL:世界上最受欢迎的数据库的简介 Apr 12, 2025 am 12:18 AM

MySQL是一种开源的关系型数据库管理系统,主要用于快速、可靠地存储和检索数据。其工作原理包括客户端请求、查询解析、执行查询和返回结果。使用示例包括创建表、插入和查询数据,以及高级功能如JOIN操作。常见错误涉及SQL语法、数据类型和权限问题,优化建议包括使用索引、优化查询和分表分区。

MySQL的位置:数据库和编程 MySQL的位置:数据库和编程 Apr 13, 2025 am 12:18 AM

MySQL在数据库和编程中的地位非常重要,它是一个开源的关系型数据库管理系统,广泛应用于各种应用场景。1)MySQL提供高效的数据存储、组织和检索功能,支持Web、移动和企业级系统。2)它使用客户端-服务器架构,支持多种存储引擎和索引优化。3)基本用法包括创建表和插入数据,高级用法涉及多表JOIN和复杂查询。4)常见问题如SQL语法错误和性能问题可以通过EXPLAIN命令和慢查询日志调试。5)性能优化方法包括合理使用索引、优化查询和使用缓存,最佳实践包括使用事务和PreparedStatemen

为什么要使用mysql?利益和优势 为什么要使用mysql?利益和优势 Apr 12, 2025 am 12:17 AM

选择MySQL的原因是其性能、可靠性、易用性和社区支持。1.MySQL提供高效的数据存储和检索功能,支持多种数据类型和高级查询操作。2.采用客户端-服务器架构和多种存储引擎,支持事务和查询优化。3.易于使用,支持多种操作系统和编程语言。4.拥有强大的社区支持,提供丰富的资源和解决方案。

apache怎么连接数据库 apache怎么连接数据库 Apr 13, 2025 pm 01:03 PM

Apache 连接数据库需要以下步骤:安装数据库驱动程序。配置 web.xml 文件以创建连接池。创建 JDBC 数据源,指定连接设置。从 Java 代码中使用 JDBC API 访问数据库,包括获取连接、创建语句、绑定参数、执行查询或更新以及处理结果。

docker怎么启动mysql docker怎么启动mysql Apr 15, 2025 pm 12:09 PM

在 Docker 中启动 MySQL 的过程包含以下步骤:拉取 MySQL 镜像创建并启动容器,设置根用户密码并映射端口验证连接创建数据库和用户授予对数据库的所有权限

phpMyAdmin全面使用指南 phpMyAdmin全面使用指南 Apr 10, 2025 pm 10:42 PM

phpMyAdmin不仅仅是数据库管理工具,它能让你深入理解MySQL,提升编程技巧。核心功能包括CRUD和SQL查询执行,理解SQL语句的原理至关重要。高级技巧包括导出/导入数据和权限管理,需要深入的安全理解。潜在问题包括SQL注入,解决方案是参数化查询和备份。性能优化涉及SQL语句优化和索引使用。最佳实践强调代码规范、安全实践和定期备份。

centos安装mysql centos安装mysql Apr 14, 2025 pm 08:09 PM

在 CentOS 上安装 MySQL 涉及以下步骤:添加合适的 MySQL yum 源。执行 yum install mysql-server 命令以安装 MySQL 服务器。使用 mysql_secure_installation 命令进行安全设置,例如设置 root 用户密码。根据需要自定义 MySQL 配置文件。调整 MySQL 参数和优化数据库以提升性能。

See all articles