`
风雪涟漪
  • 浏览: 507016 次
  • 性别: Icon_minigender_1
  • 来自: 大连->北京
博客专栏
952ab666-b589-3ca9-8be6-3772bb8d36d4
搜索引擎基础(Search...
浏览量:9009
Ae468720-c1b2-3218-bad0-65e2f3d5477e
SEO策略
浏览量:18388
社区版块
存档分类
最新评论

Schema的优化和索引 - 高性能的索引策略 - 使用索引扫描来进行排序

阅读更多

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。这个以后会详细说到。

 

 

 

 

0
0
分享到:
评论

相关推荐

    查看mySQL数据库索引

    从这个例子中可以看出,MySQL使用了两个索引来优化查询:`idx_t4_id` 和 `idx_t4_accountid`。 通过以上内容的学习,我们可以了解到如何在MySQL中查看索引信息以及如何使用`EXPLAIN`命令来检查索引是否被正确地应用...

    mysql面试题-mysql经典面试题目-数据库的基本概念-SQL语法-事务处理-索引优化-性能调优-mysql-面试题目

    性能监控和调优工具,如MySQL的Performance Schema和InnoDB Monitor,帮助识别性能瓶颈并优化数据库设置。 数据库连接字符串是用于连接数据库的应用程序配置,包含数据库地址、端口、用户名、密码等信息。 视图的...

    MYSQL使用心得(三)----性能与管理优化

    本文将深入探讨如何通过配置文件、查询优化、索引策略以及维护实践来优化MySQL的性能和管理。 首先,我们关注的是`my.cnf`配置文件。这是MySQL服务器的主要配置文件,用于设定数据库的各项运行参数。比如,可以通过...

    PyPI 官网下载 | tableschema-elasticsearch-0.3.0.tar.gz

    总的来说,`tableschema-elasticsearch-0.3.0.tar.gz`为Python开发者提供了一个有效桥梁,连接了Table Schema的结构化数据管理与Elasticsearch的大数据存储和检索能力。这使得在处理大规模数据时,可以利用Elastic...

    Mysql性能优化教程.doc

    - **解决方案**: 使用一次性的排序和折半查找技术来实现高效查询。 - **实战范例2**: 查找同一地区的异性用户 - **挑战**: 如何优化高并发场景下的查询性能。 - **查询SQL**: ``` SELECT * FROM user WHERE ...

    Mysql优化选择最佳索引的方法共2页.pdf.zip

    10. **监控和调整**:定期检查数据库性能,使用性能分析工具,如MySQL的Performance Schema,发现潜在的索引问题,并根据实际情况调整索引策略。 综上所述,优化MySQL索引的关键在于理解业务需求,结合查询模式和...

    高效MySQL查询加速指南:索引策略、查询优化、性能调优,助力数据库管理员和开发者突破性能瓶颈

    ### 高效MySQL查询加速指南:索引策略、查询优化、性能调优 在数据库管理和开发领域中,MySQL因其灵活性和高效性而受到广泛欢迎。然而,在面对大规模数据集时,即使是性能强大的MySQL也可能遇到查询速度慢的问题。...

    oracle创建表,索引,表空间,触发器,schema用户,序列的Sql文

    1. **创建表**:在Oracle中,使用`CREATE TABLE`语句来定义新的表格结构。例如: ```sql CREATE TABLE Employees ( EmployeeID INT PRIMARY KEY, FirstName VARCHAR2(50), LastName VARCHAR2(50), Position ...

    DB2索引分析器使用简述

    ### DB2索引分析器使用详解 在DB2数据库系统中,索引是优化查询性能的关键因素之...需要注意的是,在实施任何由db2advis提出的建议之前,都应该对其进行彻底的测试,以确保不会对现有系统的稳定性和性能造成负面影响。

    MySQL数据库:使用NAVICAT工具创建和管理索引.pptx

    在MySQL中,索引的管理和创建是数据库性能优化的重要环节。NAVICAT是一款强大的数据库管理工具,支持多种数据库系统,包括MySQL,提供了一个直观的图形用户界面,使得数据库操作变得更为简单。 **创建索引** 1. **...

    VIP-mysql索引优化实战一.pdf

    为了进一步理解MySQL是如何选择最优的索引策略的,可以使用`trace`工具来进行分析。该工具能够提供详细的执行计划和优化过程信息,但需要注意的是,它可能会影响MySQL的性能,因此只应在临时调试时使用: 1. **启用...

    【整理】数据库面试题索引sql优化+数据库SQL优化总结之百万级数据库优化

    5. **性能监控与调优工具**:学习如何使用如MySQL的Performance Schema、Oracle的Automatic Workload Repository (AWR)等工具进行性能监控和调优。 6. **数据备份与恢复**:高效的数据备份策略和恢复计划对于保障...

    Schema_Workbench

    5. **验证和测试**:运行查询以确保立方体正确无误,并进行性能优化。 6. **报表创建**:在Pentaho BI Server上基于cube创建报表和仪表板。 ### 5. Schema_Workbench的最佳实践 - 遵循良好的数据仓库设计原则,如...

    mysql优化方案

    本文讨论了 MYSQL 优化方案的多个方面,涵盖 BIOS 设置优化、IO 子系统优化、Schema 设计优化、索引设计优化和无法使用索引的场景等方面的知识点,旨在帮助读者更好地了解 MYSQL 优化的方法和策略。

    VIP-mysql索引优化实战一(1)1

    通过观察`optimizer_trace`的输出,我们可以理解MySQL做出这一决策的具体原因,从而对索引策略进行调整优化。 总之,MySQL的索引选择策略取决于多个因素,包括但不限于查询条件、数据分布、索引类型和统计信息。在...

    Mysql性能优化教程

    优化执行过程包括避免全表扫描,尽可能利用索引来加速查询,以及减少不必要的数据传输。 **认识数据索引**,索引是数据库中用于快速查找记录的一种数据结构。它像书的目录一样,可以快速定位到所需的数据。**为什么...

    Oracle 索引 详解

    * 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 * 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 1.3 索引不足 索引也存在一些不足之处: * 创建索引...

    高性能MySQL(第3版).part2

    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 ...

Global site tag (gtag.js) - Google Analytics