MySQL查询优化系列讲座之查询优化器(2)

    为了使这个查询的效率更高,给其中一个联结列添加索引并重新执行EXPLAIN语句:

mysql> ALTER TABLE t2 ADD INDEX (i2);
mysql> EXPLAIN SELECT t1.i1, t2.i2 FROM t1, t2 WHERE t1.i1 = t2.i2\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t1
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1000
Extra:
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: t2
type: ref
possible_keys: i2
key: i2
key_len: 5
ref: sampdb.t1.i1
rows: 10
Extra: Using where; Using index

我们可以看到性能提高了。T1的输出没有改变(表明还是需要进行全表扫描),但是优化器处理t2的方式就有所不同了:

· 类型从ALL改变为ref,意味着可以使用参考值(来自t1的值)来执行索引查找,定位t2中合格的数据行。

· 参考值在参考(ref)字段中给出了:sampdb.t1.i1。

· 行数值从1000降低到了10,显示出优化器相信对于t1中的每一行,它只需要检查t2中的10行(这是一个悲观的估计值。实际上,在t2中只有一行与t1中数据行匹配。我们在后面会看到如何帮助优化器改善这个估计值)。数据行组合的全部估计值使1000×10=10000。它比前面的没有索引的时候估计出来的一百万好多了。

对t1进行索引有价值吗?实际上,对于这个特定的联结操作,扫描一张表是必要的,因此没有必要对t1建立索引。如果你想看到效果,可以索引t1.i1并再次运行EXPLAIN:

mysql> ALTER TABLE t1 ADD INDEX (i1);
mysql> EXPLAIN SELECT t1.i1, t2.i2 FROM t1, t2 WHERE t1.i1 = t2.i2\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t1
type: index
possible_keys: i1
key: i1
key_len: 5
ref: NULL
rows: 1000
Extra: Using index
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: t2
type: ref
possible_keys: i2
key: i2
key_len: 5
ref: sampdb.t1.i1
rows: 10
Extra: Using where; Using index

上面的输出与前面的EXPLAIN的输出相似,但是添加索引对t1的输出有一些改变。类型从NULL改成了index,附加(Extra)从空的改成了Using index。这些改变表明,尽管对索引的值仍然需要执行全表扫描,但是优化器还是可以直接从索引文件中读取值,根据不需要使用数据文件。你可以从MyISAM表中看到这类结果,在这种情况下,优化器知道自己只询问索引文件就能够得到所有需要的信息。对于InnoDB 和BDB表也有这样的结果,在这种情况下优化器可以单独使用索引中的信息而不用搜索数据行。

时间: 2024-09-15 02:46:06

MySQL查询优化系列讲座之查询优化器(2)的相关文章

MySQL查询优化系列讲座之查询优化器(1)

    当你提交一个查询的时候,MySQL会分析它,看是否可以做一些优化使处理该查询的速度更快.这一部分将介绍查询优化器是如何工作的.如果你想知道MySQL采用的优化手段,可以查看MySQL参考手册. 当然,MySQL查询优化器也利用了索引,但是它也使用了其它一些信息.例如,如果你提交如下所示的查询,那么无论数据表有多大,MySQL执行它的速度都会非常快: SELECT * FROM tbl_name WHERE 0; 在这个例子中,MySQL查看WHERE子句,认识到没有符合查询条件的数据行,

MySQL查询优化系列讲座之调度和锁定

    前面的部分主要是聚焦于如何让单独的查询执行的速度更快.MySQL还允许你改变语句调度的优先级,它可以使来自多个客户端的查询更好地协作,这样单个客户端就不会由于锁定而等待很长时间.改变优先级还可以确保特定类型的查询被处理得更快.这一部分讲解MySQL的默认的调度策略和可以用来影响这些策略的选项.它还谈到了并发性插入操作的使用和存储引擎锁定层次对客户端的并发性的影响.为了讨论的方便,我们把执行检索(SELECT)的客户端称为"读取者",把执行修改操作(DELETE.INSERT.R

MySQL查询优化系列讲座之数据类型与效率

    这一部分提供了如何选择数据类型来帮助提高查询运行速度的一些指导: 在可以使用短数据列的时候就不要用长的.如果你有一个固定长度的CHAR数据列,那么就不要让它的长度超出实际需要.如果你在数据列中存储的最长的值有40个字符,就不要定义成CHAR(255),而应该定义成CHAR(40).如果你能够用MEDIUMINT代替BIGINT,那么你的数据表就小一些(磁盘I/O少一些),在计算过程中,值的处理速度也快一些.如果数据列被索引了,那么使用较短的值带来的性能提高更加显著.不仅索引可以提高查询速

MySQL学习系列2--MySQL执行计划分析EXPLAIN

原文:MySQL学习系列2--MySQL执行计划分析EXPLAIN 1.Explain语法 EXPLAIN SELECT -- 变体:   EXPLAIN EXTENDED SELECT -- 将执行计划"反编译"成SELECT语句,运行SHOW WARNINGS 可得到被MySQL优化器优化后的查询语句   2.执行计划分析和实例 创建员工表Employee create table Employee ( ID int auto_increment, Ename varchar(32

资深网站运营总监“莫言”的网站运营系列讲座(一)

网站运营 主讲:莫言主题:网站运营系列讲座(一) 讲课记录: 运营一个网站,咱们还是先从自身资源开始谈 自身资源里,包括了人员,资金,你的站所处领域里你对业务的熟悉程度 当然也包括一些硬件资源 类似服务器,或者空间 带宽 这些都是需要你前期考虑好的,并辅助与实施的 这里,要着重提的是你做站一定要选自己熟悉的行业领域 引一句话"不要拿自己的弱项跟人家的强项拼" 选择自己熟悉,或者说正在从事的领域行业来做站这是首选的 还包括你领域里可以整合其他的小范围领域 这些..可以统称为"网

Mysql入门系列:客户机程序5—MYSQL交互式查询程序

6.7 客户机程序5-交互式查询程序 让我们把迄今为止研究的诸多内容整理一下,编写一个简单的交互式客户机程序.它的功能包括可以进入查询,用通用目标查询处理程序process_query 执行查询,并用前面研究过的显示格式process_result_set() 显示查询结果. 客户机程序5在某些方面与mysql类似,虽然在几个特征上还是有所不同.客户机程序5在输入上有几个约束条件: ■ 每个输入行必须包括一个完整的查询. ■ 查询不会以分号或' g'为终止. ■ 不识别类似quit 的命令:而是

单片机-基于51系列的电阻筛选器怎么样求详细

问题描述 基于51系列的电阻筛选器怎么样求详细 程序中设定好范围,直接检测看结果. 如设定范围10--11K,待测电阻10K.在范围内绿灯亮,不在红灯亮.求具体求大神 解决方案 这个要设计电路部分只有单片机肯定不行 解决方案二: 串电阻,分压.单片机AD采集后,根据电压大小,根据公式测出电阻大小,再进行点灯...不知可否.

HDwiki系列讲座第九期: 网络广告联盟广告投放技巧

中介交易 SEO诊断 淘宝客 云主机 技术大厅 大家好,很荣幸能担任本次讲座的嘉宾,由于讲座的主题是"网络广告联盟广告投放技巧",所以,我还是要先给大家简单介绍一下什么是网络广告联盟. 下面开始进入主题 一.什么是网络广告联盟 网络广告联盟,又称联盟营销,指集合中小网络媒体资源(又称联盟会员,如中小网站.个人网站.WAP 站点等)组成联盟,通过联盟平台帮助广告主实现广告投放,并进行广告投放数据监测统计, 广告主则按照网络广告的实际效果向联盟会员支付广告费用的网络广告组织投放形式. 网络

Java Socket+mysql实现简易文件上传器的代码_java

最近跟着某网站学习了一个小项目,因为白天有课,所以都是晚上写的,今天把它完成了. 项目主要是实现一个文件上传器,通过客户端的登陆,把本地文件上传到服务器的数据库(本地的). 首先建两个表如下: 一个文件信息表 CREATE TABLE `fileinfo` ( `Fname` char(50) NOT NULL, `FInfo` blob NOT NULL, `FId` int(10) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`FId`) ) ENGINE=I