MySQL有两种方法生成有序的结果:使用文件排序或者按顺序的扫描索引。你可以使用EXPLAIN来查看type列是否是index来得知MySQL是否计划的扫描索引。
扫描索引本身是非常快速的,因为它只是简单的需要从一个索引实体移动到下一个。然而,如果MySQL没有使用索引覆盖这个查询,它就会查找在索引中发现的每一行。这是个随机IO的过程,因此从索引顺序中读取数据比连续表的扫描要慢很多。
MySQL可以使用相同的索引来排序和查找行。如果可能,同时满足这两个任务是再好不过的事情了。
当索引的顺序和order by条件顺序相同并且所有的列都在同一个方向(升序或降序)时,通过索引排序才能好用。如果查询关联了多张表,所有order by 条件后的列必须是第一张表的情况下,才能使用索引排序。ORDER BY条件也和查询有相同的限制:它需要形成一个左端前缀的索引。在其他的情况下MySQL使用文件排序。
有一种情况就是,ORDER BY后的条件并不是最左端的索引前缀,如果WHERE条件或者一个JOIN条件也赋予了这些缺失索引的值,那么依然可以使用索引来排序。
比如,rental表有一个索引(rental_date, inventory_id, customer_id)。、
CREATE TABLE rental (
...
PRIMARY KEY (rental_id),
UNIQUE KEY rental_date (rental_date,inventory_id,customer_id),
KEY idx_fk_inventory_id (inventory_id),
KEY idx_fk_customer_id (customer_id),
KEY idx_fk_staff_id (staff_id),
...
);
MySQL会使用rental_date索引去排序下列查询
mysql> EXPLAIN SELECT rental_id, staff_id FROM sakila.rental
-> WHERE rental_date = '2005-05-25'
-> ORDER BY inventory_id, customer_id\G
*************************** 1. row ***************************
type: ref
possible_keys: rental_date
key: rental_date
rows: 1
Extra: Using where
这是可以使用索引排序的,即使ORDER BY条件并不是最左边的索引前缀。那是因为我们已经在where条件后指定了第一列索引的值。
下面也是可以使用索引排序的一些查询。下面的一个可以使用索引,是因为查询已经使用了第一个索引列并且用order by指定了第二个索引列。一起来看,就是一个最左边的索引前缀。
... WHERE rental_date = '2005-05-25' ORDER BY inventory_id DESC;
下面的语句也可以,因为order by后的条件也是最左边的索引前缀。
... WHERE rental_date > '2005-05-25' ORDER BY rental_date, inventory_id;
下面都是不能使用索引排序的语句:
- 这个查询使用了排序的不同方向,但是这个索引列都是升序。
- ... WHERE rental_date = '2005-05-25' ORDER BY inventory_id DESC, customer_id ASC;
- 下面的语句,ORDER BY 后面的列并不是索引。
- ... WHERE rental_date = '2005-05-25' ORDER BY inventory_id, staff_id;
- 下面的语句,并不是最左端的索引前缀。
- ... WHERE rental_date = '2005-05-25' ORDER BY customer_id;
- 这个语句对第一个字段使用了范围查询,所以MySQL就不会使用剩下的索引。
- ... WHERE rental_date > '2005-05-25' ORDER BY inventory_id, customer_id;
- 对于inventory_id列有很多相同的条件。对于这种排序,和查询一个范围一样。
- ... WHERE rental_date = '2005-05-25' AND inventory_id IN(1,2) ORDER BY customer_id;
- 下面的语句,从表面上看可以使用索引去排序,但是实际上却不能,因为语句优化器把film_actor表放到了第二的位置。以后再讲这是为什么。
- mysql> EXPLAIN SELECT actor_id, title FROM sakila.film_actor
- -> INNER JOIN sakila.film USING(film_id) ORDER BY actor_id\G
- +------------+----------------------------------------------+
- | table | Extra |
- +------------+----------------------------------------------+
- | film | Using index; Using temporary; Using filesort |
- | film_actor | Using index |
- +------------+----------------------------------------------+
使用索引来排序其中最重要就是一个查询有ORDER BY和LIMIT。这个以后会详细说到。
分享到:
相关推荐
oracle创建表,索引,表空间,触发器,schema用户,序列的Sql文
5.3.7使用索引扫描来做排序175 5.3.8压缩(前缀压缩)索引177 5.3.9冗余和重复索引178 5.3.10未使用的索引181 5.3.11索引和锁181 5.4索引案例学习183 5.4.1支持多种过滤条件183 5.4.2避免多个范围条件185 ...
----便于用户观察和使用 C-I Mapping:Conceptual Schema-Internal Schema Mapping ----将概念模式映射为内模式,从而支持实现数据概念视图向内部视图的转换 ----便于计算机进行存储和处理 两个独立性? 逻辑数据...
Solr 可以高亮显示搜索结果,通过索引复制来提高可用,性,提供一套强大 Data Schema 来定义字段,类型和设置文本分析,提供基于 Web 的管理界面等。 Key-Value Store Indexer 这个组件非常关键,是 Hbase 到 Solr ...
第五章创建高性能索引;第六章查询性能优化;第七章mysql高级特性;第八章优化服务器设置;第九章操作系统和硬件优化;第十章复制;第十一章可扩展的mysql;第十二章高可用性;第十三章云端的mysql;第十四章应用层...
第1章 mysql 架构与历史 1 第2章 mysql 基准测试 35 第3章 服务器性能剖析 67 第4章 schema 与数据类型优化 111 第5章 创建高性能的索引 141 第6章 查询性能优化 195 第7章 mysql 高级特性 259 第8章 优化服务器设置...
同步新表同步轴向变动:添加,修改同步索引变动:添加,修改支持预览(只对比不同步变动)邮件通知变动结果支持屏蔽更新表,基线,索引,外键支持本地比线上额外的多一些表,分段,索引,外键安装去-u github....
mySQL索引查看 select * from information_schema.statistics where table_schema='数据库名称' and table_name = '表名称'
第5章 创建高性能的索引 141 第6章 查询性能优化 195 第7章 mysql 高级特性 259 第8章 优化服务器设置 325 第9章 操作系统和硬件优化 377 第10章 复制 433 第11章 可扩展的mysql 501 第12章 高可用性 543 第13章 ...
高性能 Mysql免费下载,sql语句优化,索引建立,schema与数据库类型优化!
第5章 创建高性能的索引 第6章 查询性能优化 第7章 MySQL 高级特性 第8章 优化服务器设置 第9章 操作系统和硬件优化 第10章 复制 第11章 可扩展的MySQL 第12章 高可用性 第13章 云端的MySQL 第14章 应用层...
索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得更快,MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查询优化技巧。 Mongoose 中除了以前创建索引的方式...
深度克隆并返回模式的副本,向该模式添加关键路径/模式类型对,您还可以添加另一个模式并复制所有路径、虚拟、getter、setter、索引、方法和静态。 特征: 深度克隆模式 复制路径、虚拟、getter、setter、索引、...
使用命令行可以轻松列出给定表的数据库表和列。 安装 您可以通过composer安装该软件包: composer require ohseesoftware/laravel-schema-list 用法 列出默认连接中的表: php artisan schema:tables 列出给定表...
两层映像 E-C Mapping:External Schema-Conceptual Schema Mapping ----将外模式映射为概念模式,从而支持实现数据概念视图向外部视图的转换 ----便于用户观察和使用 C-I Mapping:Conceptual Schema-Internal ...
CREATE INDEX --为数据库表创建一个索引 DROP INDEX --从数据库中删除索引 CREATE PROCEDURE --创建一个存储过程 DROP PROCEDURE --从数据库中删除存储过程 CREATE TRIGGER --创建一个触发器 DROP TRIGGER --...
特别是我们的目标是: 使用隔离的环境来开发,阶段化/测试并部署到生产中使用更好的工具来配置/配置这些环境使用linting,代码格式和其他类似工具来防止简单的错误(不再出现'Whoops,missed a ; 'commits) 减少...