首页
|
Vista
|
WinXP
|
Java
|
程序开发
|
SEO优化
|
网络应用
|
硬件资讯
|
计算机等级认证
|
网站建设
|
问题帮助
|
图形图象
|
立珊英语
微软认证
|
思科认证
|
Java认证
|
Linux认证
|
Oracle认证
|
程序员
|
电子商务
|
网络工程
|
信息系统
|
软件设计
|
信息技术
|
网络管理
程序开发
编程语言
|
数据库开发
|
Web开发
|
移动开发
|
软件工程
|
电子商务
您现在的位置:
立珊计算机专业网
>
程序开发
>
数据库开发
>
Mysql
>> 文章内容
G
o
o
g
l
e
三方法优化MySQL数据库查询
2007-12-08 04:36:07 来源:立珊网络计算机专业网
推荐给好友
收藏本页
保存本文
在优化查询中,数据库应用(如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%!自然,数据库资源的查询速度更快,效率更高。
转贴于:立珊网络计算机专业网站
相关关键字:
方法
上一篇:
UNIX设置MySql数据同步 实现复制功能
下一篇:
MySQL数据导入导出方法与工具介绍
【
设为主页
】【
加入收藏
】【
打印本文
】【
回到顶部
】【
关闭此页
】
点击查看
已有
0
位对此新闻感兴趣的网友发表了看法
我的通行证:
密码:
验证码:
匿名
注册通行证
相关文章
·
MySQL数据导入导出方法与工具介绍
·
MySQL ODBC进行MySQL和SQL Server转换
·
用你想不到的MySQL运算符获得更多数据比较功能
·
怎样在Mysql中直接储存图片
·
帮助你开发基于MySQL数据库的论坛设计
·
MySQL数据库配置技巧
·
如何利用Debugview方式来调试MySQL UDF
·
Linux系统下使用Coredump时应注意事项
·
讲解MySQL服务器安装之后如何调节性能
·
MySQL服务器内部安全数据目录如何访问
推荐文章
·
MySQL权威指南读书笔记
·
PHP之Smarty指导入门
·
MySQL数据库备份
·
MySQL数据库中SELECT语句快速精细掌握
·
MySQL 5.0 数据库的新特性的存储过程
·
用PHP实现验证码功能
·
数据库新手入门之MySQL中如何定义外键
·
MySQL中多表操作和批处理详细介绍
·
使用批处理对MySQL进行数据批量操作
·
MySQL系统服务安装与卸载精彩问题汇总
Java编程技巧
JSP Servlet JSF异常框架设计
JAVA异常处理方式的区别和分析
java中判断字符串是否数字的两种方法
判断数字、整数的方法 isNumeric()、isIn
Spring破冰之旅 始于足下
为Java程序中添加播放MIDI音乐功能
彻底明白 Java 语言中的IO系统
Java 6.0 操作脚本语言基础
使用Java操作Windows系统注册表
动态调用动态语言之Java脚本API
Spring集成XFire开发WebService
Java对象的序列化和反序列化实践
Java开发中的事件驱动模型实例详解
数据库开发
SQL Server与Oracle并行访问的本质区别
SQL Server2005的XML数据类型
SQL Server2005 SQLCLR代码安全性
SQL Server 查询分析器快捷键
Sql2005如何用dtexec运行ssis(DTS)包
生成100万不重复的8位编号
SELECT 赋值与ORDER BY冲突的问题
将SQL Server中的表变成txt文件
一些异常精妙的"SQL"语句
Microsoft数据平台开发与SQL Server 2008
Web网页系统开发
Javascript IDE Apatana
用json和script标签解决ajax的跨域问题
Javascript技术优化计划
escape、encodeURI、encodeURIComponent
PHP常见图形操作 玩转图像函数库
[原创]用Javascript获取系统日期
PHP中for循环语句的变型
用PHPdig打造属于你自己的Google
使用php作linux自动执行脚本
在PHP中实现进程间通讯
PHP下对缓冲区的控制
在 PHP 中用描点法“绘制”中文
PHP中路径问题的解决途径
使用数据库保存session的方法
PHP和MySQL开发的8个技巧
Delphi程序设计
一个需求分析说明书的例子
软件需求分析方法总结
Java新手上路Flash教程中文版
基于UML的短消息计费系统的分析
网站项目系统分析及软件建模
需求分析
如何进行系统分析
软件工程领域中项目管理实施体会
软件工程之需求分析
Linux操作平台
使用Tftp从网络引导Debian进行系统安装
Shell脚本显示当前网络连接与对应物理地
Linux系统下对文件进行分割与合并的技巧
Linux服务器傻瓜式安装完全接触(下)
Linux服务器傻瓜式安装完全手册
在你的Ubuntu Linux桌面上嵌入终端窗口
Linux操作系统实用技巧精彩汇集
Linux操作系统下虚拟光驱(iso)的挂载
使用Unix命令行模式高效地进行文本编辑
基于SCIM输入法自己配置一个“万能五笔”
如何使Linux系统上的程序开机后自动运行
在Ubuntu系统下安装*.bin程序
关于站点
-
广告服务
-
联系我们
-
版权隐私
-
免责声明
-
网站地图
-
意见反馈
立珊计算机IT网 版权所有. . 对本站有任何建议、意见或投诉,可以联系我们.
Copyright©2007 Www.Lis123.Com All Rights Reserved.