在优化查询中,数据库应用(如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查询的三种工具的使用方法,以此提高你的应用程序性能。使用它们快乐地优化吧!
相关推荐
基于规则的优化算法是早期数据库系统采用的主要优化方法。RBO遵循一系列预定义的优化规则,如消除冗余操作、合并相似操作、重写查询语句等。当遇到一个查询时,RBO会按照这些规则顺序应用它们,生成一个新的等价查询...
Oracle数据库作为企业级信息管理系统的重要支撑平台,其查询优化方法尤为关键。本文重点分析Oracle数据库索引及临时表在查询中的应用,并探讨了基于索引使用SQL语句进行数据库效率优化的几种实现方法。 在Oracle...
3. 遗传算法在数据库查询优化中的应用 4. 实时数据库规则在数据库查询优化中的应用 5. 基于遗传算法和实时数据库规则的数据库查询优化方案设计 相关术语: * 遗传算法 * 实时数据库 * 数据库查询 * 内存数据库 * ...
数据库查询处理通常包括以下几个主要步骤: 1. **解析(Parse)**:将SQL语句转换成内部表示形式。 2. **分析(Analyze)**:对SQL语句进行语法和语义检查。 3. **优化(Optimize)**:选择最合适的查询执行计划。 4...
### 分布式数据库查询优化详解 #### 一、背景与挑战 随着信息技术的快速发展和各行各业对数据处理需求的增加,数据库系统面临着前所未有的挑战。一方面,数据量的急剧增长要求数据库具备更高的存储能力和更快的...
### 数据库查询优化的核心知识点 #### 一、查询优化的重要性 数据库查询优化是数据库管理系统(DBMS)中的关键组件,其目标在于选择最有效的查询执行计划,以最小化资源消耗(如CPU时间、I/O操作)并提高响应速度。...
根据提供的文件信息,我将详细解释分布式数据库查询策略优化方法的相关知识点。 分布式数据库是由多个位于不同地理位置的数据库组成,它们通过网络互联,形成一个整体。在分布式数据库系统中,数据在多个节点上进行...
分布式数据库查询优化是指在分布式计算环境下,对数据库的查询请求进行性能提升的技术。这种方法主要关注如何提高查询效率,降低查询延迟,保证查询结果的准确性和一致性。查询优化是数据库管理系统中非常重要的环节...
数据库查询慢的问题是许多系统性能瓶颈的根源,尤其是在大数据量和高并发的环境中。以下是对标题和描述中提到的知识点的详细解释以及优化查询的方法: 1. **索引的使用**:索引是提高查询效率的关键。如果没有索引...
本文将探讨三种行之有效的MySQL查询优化方法:合理使用索引、通过EXPLAIN分析查询以及调整MySQL内部配置。 首先,索引作为提高数据库查询效率的利器,在MySQL数据库管理中占据着举足轻重的地位。索引相当于书的目录...
MySQL 数据库是当前网络环境中最流行的开源关系型数据库之一,随着网络环境中数据总量的急剧攀升,对数据库查询的响应时间提出了更严格的要求。为了提高查询效率,需要研究 MySQL 数据库的查询性能优化。 本文主要...
随着信息技术的不断发展,数据库应用系统中存储的数据量呈现出急剧增长的趋势,这使得数据库查询性能的优化成为了一个非常关键的问题。SQL Server作为一款广泛使用的数据库管理系统,其查询性能的优劣直接影响到整个...
第三,优化方法中还包括如何消除对大型表行数据的顺序存取。顺序存取在查询操作中效率很低,尤其在嵌套查询中,顺序存取的查询效率会以指数级下降。因此,避免顺序存取是查询优化的另一个重要方面。例如,通过减少对...
数据库的查询优化是数据库管理中的核心任务之一,它关乎到系统的性能...通过以上这些策略,我们可以有效地优化数据库查询,提高系统整体性能。在实际应用中,应结合具体情况灵活运用这些方法,实现数据库性能的最大化。
#### 三、SQL Server数据库查询优化方法 在SQL Server数据库中,Transact-SQL是一种用于实现客户端应用程序与服务器数据库之间通信的重要脚本语言。下面介绍几种常用的SQL Server查询优化方法: 1. **合理使用索引...
数据库查询优化是指在数据库管理系统中,为了提高查询效率和减少查询时间,所采取的一系列优化技术和方法。MS SQL Server是Microsoft研发的一种大型客户机/服务器式数据库管理系统,具有很强的安全性和高效的查询...
4. 分布式查询优化方法:分布式数据库查询优化方法通常涉及多个方面的考量,如节点间的通信成本、数据重分布的成本、并行处理的效率等。具体方法包括但不限于: - 联接操作优化:比如使用分布式哈希联接,减少数据...