`

<转>三个方法优化MySQL数据库查询

 
阅读更多
原链接:http://www.bitscn.com/pdb/mysql/200710/116880.html

在优化查询中,数据库应用(如MySQL)即意味着对工具的操作与使用。使用索引、使用EXPLAIN分析查询以及调整MySQL的内部配置可达到优化查询的目的。
 任何一位数据库程序员都会有这样的体会:高通信量的数据库驱动程序中,一条糟糕的SQL查询语句可对整个应用程序的运行产生严重的影响,其不仅消耗掉更多的数据库时间,且它将对其他应用组件产生影响。
 如同其它学科,优化查询性能很大程度上决定于开发者的直觉。幸运的是,像MySQL这样的数据库自带有一些协助工具。本文简要讨论诸多工具之三种:使用索引,使用EXPLAIN分析查询以及调整MySQL的内部配置。
#1: 使用索引
 MySQL允许对数据库表进行索引,以此能迅速查找记录,而无需一开始就扫描整个表,由此显著地加快查询速度。每个表最多可以做到16个索引,此外MySQL还支持多列索引及全文检索。
 给表添加一个索引非常简单,只需调用一个CREATE INDEX命令并为索引指定它的域即可。列表A给出了一个例子:
列表 A
mysql> CREATE INDEX idx_username ON users(username);
Query OK, 1 row affected (0.15 sec)
Records: 1  Duplicates: 0  Warnings: 0
 这里,对users表的username域做索引,以确保在WHERE或者HAVING子句中引用这一域的SELECT查询语句运行速度比没有添加索引时要快。通过SHOW INDEX命令可以查看索引已被创建(列表B)。
列表 B
mysql> SHOW INDEX FROM users;
--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name     | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| users |          1 | idx_username |            1 | username    | A         |      NULL |     NULL | NULL   | YES  | BTREE      |         |
--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
1 row in set (0.00 sec)
 值得注意的是:索引就像一把双刃剑。对表的每一域做索引通常没有必要,且很可能导致运行速度减慢,因为向表中插入或修改数据时,MySQL不得不每次都为这些额外的工作重新建立索引。另一方面,避免对表的每一域做索引同样不是一个非常好的主意,因为在提高插入记录的速度时,导致查询操作的速度减慢。这就需要找到一个平衡点,比如在设计索引系统时,考虑表的主要功能(数据修复及编辑)不失为一种明智的选择。
#2: 优化查询性能
 在分析查询性能时,考虑EXPLAIN关键字同样很管用。EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作、以及MySQL成功返回结果集需要执行的行数。下面的一个简单例子可以说明(列表C)这一过程:
列表 C
mysql> EXPLAIN SELECT city.name, city.district FROM city, country WHERE city.countrycode = country.code AND country.code = 'IND';
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table   | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | country | const | PRIMARY       | PRIMARY | 3       | const |    1 | Using index |
|  1 | SIMPLE      | city    | ALL   | NULL          | NULL    | NULL    | NULL | 4079 | Using where |
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+
2 rows in set (0.00 sec)这里查询是基于两个表连接。EXPLAIN关键字描述了MySQL是如何处理连接这两个表。必须清楚的是,当前设计要求MySQL处理的是country表中的一条记录以及city表中的整个4019条记录。这就意味着,还可使用其他的优化技巧改进其查询方法。例如,给city表添加如下索引(列表D):
列表 D
mysql> CREATE INDEX idx_ccode ON city(countrycode);
Query OK, 4079 rows affected (0.15 sec)
Records: 4079  Duplicates: 0  Warnings: 0
现在,当我们重新使用EXPLAIN关键字进行查询时,我们可以看到一个显著的改进(列表E):
列表 E
mysql> EXPLAIN SELECT city.name, city.district FROM city, country WHERE city.countrycode = country.code AND country.code = 'IND';
+----+-------------+---------+-------+---------------+-----------+---------+-------+------+-------------+
| id | select_type | table   | type  | possible_keys | key       | key_len | ref   | rows | Extra       |
+----+-------------+---------+-------+---------------+-----------+---------+-------+------+-------------+
|  1 | SIMPLE      | country | const | PRIMARY       | PRIMARY   | 3       | const |    1 | Using index |
|  1 | SIMPLE      | city    | ref   | idx_ccode     | idx_ccode | 3       | const |  333 | Using where |
+----+-------------+---------+-------+---------------+-----------+---------+-------+------+-------------+
2 rows in set (0.01 sec)
 在这个例子中,MySQL现在只需要扫描city表中的333条记录就可产生一个结果集,其扫描记录数几乎减少了90%!自然,数据库资源的查询速度更快,效率更高。
#3: 调整内部变量
 MySQL是如此的开放,所以可轻松地进一步调整其缺省设置以获得更优的性能及稳定性。需要优化的一些关键变量如下:
改变索引缓冲区长度(key_buffer)
 一般,该变量控制缓冲区的长度在处理索引表(读/写操作)时使用。MySQL使用手册指出该变量可以不断增加以确保索引表的最佳性能,并推荐使用与系统内存25%的大小作为该变量的值。这是MySQL十分重要的配置变量之一,如果你对优化和提高系统性能有兴趣,可以从改变key_buffer_size变量的值开始。
改变表长(read_buffer_size)
 当一个查询不断地扫描某一个表,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。如果你认为连续扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。
设定打开表的数目的最大值(table_cache)
 该变量控制MySQL在任何时候打开表的最大数目,由此能控制服务器响应输入请求的能力。它跟max_connections变量密切相关,增加table_cache值可使MySQL打开更多的表,就如增加max_connections值可增加连接数一样。当收到大量不同数据库及表的请求时,可以考虑改变这一值的大小。
对缓长查询设定一个时间限制(long_query_time)
 MySQL带有“慢查询日志”,它会自动地记录所有的在一个特定的时间范围内尚未结束的查询。这个日志对于跟踪那些低效率或者行为不端的查询以及寻找优化对象都非常有用。long_query_time变量控制这一最大时间限定,以秒为单位。
 以上讨论并给出用于分析和优化SQL查询的三种工具的使用方法,以此提高你的应用程序性能。使用它们快乐地优化吧!
分享到:
评论

相关推荐

    mysql5.1中文手册

    优化MySQL服务器&lt;br&gt;7.5.1. 系统因素和启动参数的调节&lt;br&gt;7.5.2. 调节服务器参数&lt;br&gt;7.5.3. 控制查询优化器的性能&lt;br&gt;7.5.4. 编译和链接怎样影响MySQL的速度&lt;br&gt;7.5.5. MySQL如何使用内存&lt;br&gt;7.5.6. MySQL如何使用...

    MYSQL培训经典教程(共两部分) 1/2

    数据库的备份与恢复 114&lt;br&gt;5.1 数据库目录 115&lt;br&gt;5.1.1 数据目录的位置 115&lt;br&gt;5.1.2 数据库的表示法 116&lt;br&gt;5.1.3 数据库表的表示法 117&lt;br&gt;5.1.4 MySQL的状态文件 118&lt;br&gt;5.1.5 总结 120&lt;br&gt;5.2 重定位数据库...

    MYSQL培训经典教程(共两部分) 2/2

    数据库的备份与恢复 114&lt;br&gt;5.1 数据库目录 115&lt;br&gt;5.1.1 数据目录的位置 115&lt;br&gt;5.1.2 数据库的表示法 116&lt;br&gt;5.1.3 数据库表的表示法 117&lt;br&gt;5.1.4 MySQL的状态文件 118&lt;br&gt;5.1.5 总结 120&lt;br&gt;5.2 重定位数据库...

    Tomcat下配置MySQL数据库连接池

    根据给定的部分内容,我们可以看到有两种配置MySQL数据库连接池的方法:一种是通过修改`server.xml`文件,另一种是在特定的应用程序配置文件中配置。 ##### 方法一:通过`server.xml`配置 1. **声明连接池** 在`$...

    优化MySQL数据库查询的三种方法简介

    然而,随着业务的不断扩展和数据量的持续增加,如何优化MySQL数据库的查询性能成为了一个不得不面对的问题。本文将探讨三种行之有效的MySQL查询优化方法:合理使用索引、通过EXPLAIN分析查询以及调整MySQL内部配置。...

    MySQL数据库查询优化

    第5课 查询优化技术理论与MySQL实践(三)------视图重写与等价谓词重写 什么是视图重写?哪些类型的视图可以被优化?MySQL是怎么优化视图的?从而明白在MySQL中怎么写与视图相关的查询语句才能有好的效果? 什么是...

    mysql数据库乱码问题

    解决MySQL数据库中的乱码问题需要从多个方面入手,包括但不限于调整应用程序的编码设置、优化数据库配置、确保数据传输过程中的编码一致性等。通过对以上几个案例的分析,我们可以看出,在开发过程中,确保各个层级...

    深入浅出MySQL数据库开发、优化与管理维护.doc

    本文档旨在深入浅出 MySQL 数据库开发、优化与管理维护的知识点,涵盖了 MySQL 数据库开发的基本概念、优化技巧和管理维护方法。 数据库开发篇 在本篇中,我们将学习 MySQL 数据库开发的基础知识,包括数据类型、...

    Jsp写入MySQL数据库方法

    本文将详细介绍如何使用JSP技术将数据写入MySQL数据库的方法,并通过一个简单的示例来展示这一过程。 #### 二、技术栈简介 在开始之前,我们先了解下本文所涉及的技术栈: 1. **JSP (JavaServer Pages)**:基于...

    数据库驱动 MySql SQLServer Oracle

    其中,`&lt;主机&gt;`是MySQL服务器的地址,`&lt;端口&gt;`默认为3306,`&lt;数据库名&gt;`是你想要连接的数据库,`&lt;参数&gt;`如user和password用于身份验证。 2. **SQL Server驱动**:SQL Server是由Microsoft开发的企业级数据库系统,...

    mysql+tomcat连接池的配置-心得

    在进行配置之前,确保已经安装了MySQL数据库服务器,并创建了一个用于测试的数据库(本例中为`bsf_b`)。同时,确保Tomcat服务器也已安装并能够正常运行。 #### 三、步骤详解 ##### 1. 添加MySQL驱动 首先,需要...

    优化MySQL数据库性能的八大妙手.rar

    本文将详细介绍优化MySQL数据库性能的八大妙手,帮助你提升数据库效率,减少延迟,提高用户体验。 一、索引优化 索引是提高查询速度的关键。正确地创建和使用索引可以显著加快数据检索。应为经常用于搜索和排序的列...

    c#连接mysql数据库

    #### 三、连接MySQL数据库的步骤 1. **添加引用**:在C#项目中添加对`MySql.Data`的引用。这通常可以通过NuGet包管理器完成。 ```csharp using MySql.Data; using MySql.Data.MySqlClient; ``` 2. **定义连接...

    mysql数据库安装.pdf

    你需要安装三个RPM包:`mysql-&lt;version&gt;.rpm`(MySQL客户端),`mysql-devel-&lt;version&gt;.rpm`(开发库),和`mysql-server-&lt;version&gt;.rpm`(MySQL服务器)。确保根据你的系统版本选择正确的文件名,然后通过运行以下...

    java 数据库连接池

    在上述配置中,`&lt;Resource&gt;`元素用于定义一个名为`jdbc/oracle`的数据源,类型为`javax.sql.DataSource`。`&lt;ResourceParams&gt;`元素包含了具体的数据库连接参数配置,包括连接池实现类、数据库驱动、连接URL、用户名...

    mysql数据库优化(全)

    查询优化是提升MySQL数据库性能的关键环节之一。在数据库系统中,查询操作是最常见的用户交互形式。一个查询从客户端发起,到达数据库服务器,经过处理后返回结果给客户端。尽管查询过程看似简单,但不同查询方式与...

    mysql数据库query的优化

    MySQL数据库的查询优化是数据库管理中的关键环节,它关乎到系统的性能、响应时间和资源利用率。在实际应用中,不恰当的SQL查询可能导致数据库性能急剧下降,因此了解并掌握查询优化技巧至关重要。 首先,理解索引是...

    mysql数据库性能优化

    ### MySQL数据库性能优化 #### 一、概览 在当今高度依赖互联网技术的世界里,数据库作为数据存储的核心组件,其性能直接影响着应用系统的响应速度和用户体验。MySQL作为一款广泛使用的开源关系型数据库管理系统,...

    MySQL数据库性能优化研究.docx

    本文将探讨 MySQL 数据库性能优化的关键因素,包括硬件配置、数据库设计、查询优化等方面,以期提高 MySQL 数据库的性能和响应速度。 一、硬件配置优化 1. 内存:增加服务器内存可以显著提高 MySQL 性能。对于高...

    Java+MyEclipse+Tomcat (三)配置MySQL及查询数据显示在JSP网页中_数据库_杨秀璋的专栏-CSDN博客

    本文将详细介绍如何在Java开发环境中,结合MyEclipse IDE和Tomcat服务器,配置MySQL数据库并实现查询结果显示在JSP网页中。这个过程对于任何Java Web开发者来说都是基本技能,能够帮助你构建动态的Web应用程序。 ##...

Global site tag (gtag.js) - Google Analytics