`

mysql-索引的类型的实践

 
阅读更多

1、探讨:eq_ref 和 ref的区别

CREATE TABLE `idg_1` (
   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
   `key` varchar(100) NOT NULL DEFAULT '',
   `min_id` bigint(20) NOT NULL,
   `max_id` bigint(20) NOT NULL DEFAULT '0',
   `step` int(11) NOT NULL DEFAULT '3',
   `batch_size` int(11) NOT NULL DEFAULT '3000',
   UNIQUE KEY `id` (`id`),
   UNIQUE KEY `idx_key` (`key`)
 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

CREATE TABLE `idg_2` (
   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
   `key` varchar(100) NOT NULL DEFAULT '',
   `min_id` bigint(20) NOT NULL,
   `max_id` bigint(20) NOT NULL DEFAULT '0',
   `step` int(11) NOT NULL DEFAULT '3',
   `batch_size` int(11) NOT NULL DEFAULT '3000',
   UNIQUE KEY `id` (`id`),
   UNIQUE KEY `idx_key` (`key`)
 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
CREATE TABLE `idg_3` (
   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
   `key` varchar(100) DEFAULT '',
   `min_id` bigint(20) NOT NULL,
   `max_id` bigint(20) NOT NULL DEFAULT '0',
   `step` int(11) NOT NULL DEFAULT '3',
   `batch_size` int(11) NOT NULL DEFAULT '3000',
   UNIQUE KEY `id` (`id`),
   UNIQUE KEY `idx_key` (`key`)
 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

 

 

测试:

 

EXPLAIN SELECT * FROM idg_1 a,idg_2 b WHERE a.key = b.key ;

 

 

 

 

测试:

 

EXPLAIN SELECT * FROM idg_1 a,idg_3 b WHERE a.key = b.key;

 

 

 

结论:

唯一索引:访问的时候 是:eq_ref ,

但是 连接的字段不能为null,字段为null 会影响mysql 通过索引检索的方式

 

2、唯一索引的特殊指出

CREATE TABLE `idg` (
   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
   `key` varchar(100) NOT NULL DEFAULT '',
   `max_id` bigint(20) NOT NULL DEFAULT '0',
   `step` int(11) NOT NULL DEFAULT '3000',
   `min_id` bigint(20) NOT NULL DEFAULT '0',
   UNIQUE KEY `id` (`id`),
   KEY `idx_key_step` (`step`,`key`),
   KEY `idx_key` (`key`)
 ) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8

 区别:idg: key 是普通索引;idg1:key 是唯一索引

初始化一条数据库:key=nts

测试:

EXPLAIN SELECT * FROM idg t WHERE t.key = 'A';

 

 

EXPLAIN SELECT * FROM idg_1 t WHERE t.key = 'A';

 

 

EXPLAIN SELECT * FROM idg_1 t WHERE t.key = 'nts';

 

 

结论:

唯一索引的情况,key 对应的值 表里有数据,是访问类型是const,没有的话extra 会告诉你没有数据

普通索引:需要索引检查

没有索引:全表扫描了

 

测试:一百万的数据量:有索引或者唯一索引耗时几乎为0,没有索引的话:3.5s左右

 

3、index_merge

 

mysql> EXPLAIN SELECT * FROM  i_order_inddd t WHERE t.client_ip > 'F12345' or t.qr_user_name = 'd15313'\G

注意:client_ip  qr_user_name 为独立索引 

结果:

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: t
         type: index_merge
possible_keys: index_client_ip,qr_username_index
          key: index_client_ip,qr_username_index
      key_len: 93,153
          ref: NULL
         rows: 2
        Extra: Using sort_union(index_client_ip,qr_username_index); Using where
1 row in set (0.00 sec)

 

结论:两个独立索引 通过or 连接的时候会有 index_merge,表示对结果进行merge

 

但是这一切取决于数据的构成:

mysql> EXPLAIN SELECT * FROM  i_order_inddd t WHERE t.client_ip < 'F12345' or t.qr < 'd15313'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: t
         type: ALL
possible_keys: index_client_ip,qr_username_index
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 1006423
        Extra: Using where
1 row in set (0.05 sec)

 没错!!

仅仅是表达方式的不同,type变为了全表扫描

 

 

4、覆盖索引

 索引如下:KEY `Policy_Filter_Idx` (`flight_type`,`policy_start`,`policy_expired`)

 

sql为:EXPLAIN SELECT t.policy_start FROM InternationalPolicy t WHERE t.flight_type=3

 

 

如果索引包含满足查询的所有数据,就称为覆盖索引。覆盖索引是一种非常强大的工具,能大大提高查询性能。只需要读取索引而不用读取数据有以下一些优点:

(1)索引项通常比记录要小,所以MySQL访问更少的数据;

(2)索引都按值的大小顺序存储,相对于随机访问记录,需要更少的I/O;

(3)大多数据引擎能更好的缓存索引。比如MyISAM只缓存索引。

(4)覆盖索引对于InnoDB表尤其有用,因为InnoDB使用聚集索引组织数据,如果二级索引中包含查询所需的数据,就不再需要在聚集索引中查找了。

 

使用EXPLAIN时,可以在Extra一列中看到“Using index”

 

 在大多数引擎中,只有当查询语句所访问的列是索引的一部分时,索引才会覆盖。但是,InnoDB不限于此,InnoDB的二级索引在叶子节点中存储了primary key的值。因此,sakila.actor表使用InnoDB,而且对于是last_name上有索引,所以,索引能覆盖那些访问actor_id的查询,如:

 

mysql> EXPLAIN SELECT actor_id, last_name

 

-> FROM sakila.actor WHERE last_name = 'HOPPER'\G

 

*************************** 1. row ***************************

           id: 1

 select_type: SIMPLE

        table: actor

         type: ref

possible_keys: idx_actor_last_name

          key: idx_actor_last_name

      key_len: 137

          ref: const

         rows: 2

        Extra: Using where; Using index

5、利用索引进行排序 以及filesort 

MySQL中,有两种方式生成有序结果集:

一是使用filesort

二是按索引顺序扫描。

利用索引进行排序操作是非常快的,而且可以利用同一索引同时进行查找和排序操作。当索引的顺序与ORDER BY中的列顺序相同且所有的列是同一方向(全部升序或者全部降序)时,可以使用索引来排序。如果查询是连接多个表,仅当ORDER BY中的所有列都是第一个表的列时才会使用索引。其它情况都会使用filesort。

 

举例:

 

CREATE TABLE `idg` (
   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
   `key` varchar(100) NOT NULL DEFAULT '',
   `max_id` bigint(20) NOT NULL DEFAULT '0',
   `step` int(11) NOT NULL DEFAULT '3000',
   `min_id` bigint(20) NOT NULL DEFAULT '0',
   UNIQUE KEY `id` (`id`),
   KEY `idx_key_step` (`step`,`key`),
   KEY `idx_key` (`key`)
 ) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8

 

 

执行: EXPLAIN SELECT * FROM idg t WHERE t.key = 'nts' ORDER BY t.key;

 

 

执行:EXPLAIN SELECT * FROM idg t WHERE t.key = 'nts' ORDER BY t.max_id;

 

 

结论:如果order by 的字段有索引,那么走索引排序,否则排序为:Using filesort

当MySQL不能使用索引进行排序时,就会利用自己的排序算法(快速排序算法)在内存(sort buffer)中对数据进行排序,如果内存装载不下,它会将磁盘上的数据进行分块,再对各个数据块进行排序,然后将各个块合并成有序的结果集(实际上就是外排序)

 

 

 

 

  • 大小: 3.7 KB
  • 大小: 3.6 KB
  • 大小: 2.7 KB
  • 大小: 3.3 KB
  • 大小: 2.8 KB
  • 大小: 11.4 KB
  • 大小: 4.6 KB
  • 大小: 3 KB
分享到:
评论

相关推荐

    mysql-connector-java-8.0.27.zip

    4. **JSON支持**:增强了对JSON数据类型的处理,可以进行JSON文档的索引、查询和更新。 5. **安全增强**:增加了密码加密和身份验证插件,提升了安全性。 6. **空间数据类型**:对GIS(地理信息系统)的支持得到了...

    mysql-connector-java-8.0.11

    - **性能提升**:在这一版本中,MySQL数据库进行了大量优化,包括更快的查询速度、更高效的索引处理等。 - **安全性增强**:支持更强的身份验证协议,如caching_sha2_password,提供了更高的安全性。 - **JSON...

    MySQL-5.5.28-winx64安装包以及说明文档

    MySQL是世界上最受欢迎的关系型数据库管理系统(RDBMS)之一,尤其在Web应用程序中广泛应用。5.5.28是MySQL的一个稳定版本,提供了许多增强功能和优化,旨在提高性能、可扩展性和安全性。本篇文章将深入探讨MySQL ...

    mysql-connector-java-8.0.24

    MySQL Connector/J 8.0.24 是MySQL数据库与Java应用程序之间的重要桥梁,它是一个用于连接Java...最后,了解并遵循MySQL的最佳实践,如合理设计数据库架构、索引管理和事务处理,有助于提升整个系统的稳定性和效率。

    mysql-installer-community-8.0.23.0.rar

    8.0版本带来了许多性能和功能上的提升,包括InnoDB存储引擎的优化,支持更大范围的索引类型,以及更强大的JSON处理能力。此外,它还提供了增强的安全性,例如默认的加密连接和更严格的密码策略。 在MySQL 8.0.23.0...

    MySQLSQL高级特性字段约束-索引-视图-外键学习实践.rar

    1. **B-Tree索引**:最常用的索引类型,适用于等值查询,支持升序和降序。 2. **哈希索引**:主要用于内存中的MyISAM表,提供快速的等值查找,但不支持范围查询。 3. **全文索引**:用于文本搜索,提供更复杂的模糊...

    MySQL-进阶.pdf

    B+树索引是MySQL中最常用的索引类型之一,其特点是所有叶子节点都指向物理磁盘地址,这使得查找过程非常高效。 #### 三、性能调优 性能调优是MySQL进阶学习的重要部分,涉及到多个方面的调整和优化。 - **SQL语句...

    mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz

    MySQL是世界上最受欢迎的开源关系型数据库管理系统之一,尤其在Web应用程序中被广泛使用。这个压缩包文件"mysql-...正确安装并配置MySQL 5.7.17,结合良好的安全和性能实践,将为业务提供稳定且高效的数据库服务。

    atlas 的 mysql-bridge.zip

    1. **元数据同步**:MySQL-Bridge 主要负责将 MySQL 数据库的表结构、索引、视图等元数据实时同步到 Atlas 平台,确保 Atlas 中的数据模型与 MySQL 实例保持一致。 2. **变更数据捕获**:除了基础的元数据同步,...

    mysql-5.5.18-win32安装包及教程

    总结,MySQL 5.5.18-win32的安装和使用教程涵盖了数据库管理、SQL操作、用户权限、备份恢复、性能优化等多个方面,旨在帮助用户全面掌握MySQL的基本操作和最佳实践。通过这个教程,无论是新手还是经验丰富的开发者,...

    MySQL 索引最佳实践

    ### MySQL索引最佳实践 #### 理解索引的重要性 在数据库管理中,索引是一种数据结构,用于提高查询速度。它对于开发者和数据库管理员(DBA)来说至关重要。索引选择不当可能会导致生产环境中的诸多问题。尽管索引...

    mysql-5.7.24-winx64.rar

    1. **性能提升**: MySQL 5.7.24引入了InnoDB存储引擎的性能改进,包括更快的索引插入和查询优化。这得益于更好的内存管理、并行插入和更高效的缓冲池策略。 2. **JSON支持**: 该版本增强了对JSON数据类型的支持,...

    mysql-5.7.28-winx64.zip

    在使用MySQL 5.7.28时,还需要考虑安全性和最佳实践。例如,应该定期备份数据库,以防止数据丢失;为不同的用户分配最小权限,遵循最小权限原则;并定期更新到最新版本以获取最新的安全补丁。 总的来说,"mysql-...

    mysql-5.5.40-win64.rar

    安装“mysql-5.5.40-win64.msi”文件时,用户将被引导完成一系列配置步骤,包括设置 root 用户密码、选择服务器类型(开发、生产或服务器群集)、以及选择是否安装额外的组件,如 MySQL Workbench(数据库管理和设计...

    MySQL索引最佳实践

    #### 二、MySQL索引类型详解 ##### 1. B-Tree索引 - **定义**:B-Tree(平衡树)是最常见的索引类型,在大多数情况下使用的索引都属于此类。B-Tree能够支持范围查找、前缀查找以及等值查找等多种操作。 - **特点**...

    mysql-5.5.36-win32数据库安装.zip

    - **InnoDB存储引擎增强**:MySQL 5.5对InnoDB存储引擎进行了大量优化,包括更好的并发处理能力,支持更大的行内数据存储,以及更高效的全文索引。 - **Performance Schema**:引入了性能模式,提供了一个无侵入式...

    mysql-essential-5.0.27-win32.rar

    最后,MySQL的性能调优是一个深入的话题,涉及到索引优化、查询优化、内存设置和配置文件的调整。通过分析查询日志、使用EXPLAIN计划和调整服务器参数,可以提高数据库的响应速度和整体性能。 总的来说,"mysql-...

    mysql-5.6.51-linux-glibc2.12-x86_64.tar.gz

    2. **全文搜索**:MySQL 5.6增强了全文索引功能,支持更多的分词器和更精确的匹配,提升了搜索体验。 3. **分区表**:在这一版本中,分区表功能得到了加强,支持更多类型的分区策略,如线性哈希分区,这有助于大型...

    MySQL-server-5.5.23-1.linux2.6.i386.rar

    它还支持更多索引类型,如全文索引,以及更大的表空间。 2. **并行复制**:MySQL 5.5引入了半同步复制,确保至少一个从库接收到主库的更新后,主库才确认事务。这提高了数据的一致性。 3. **性能优化**:通过优化...

Global site tag (gtag.js) - Google Analytics