`

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索引最佳实践

    讲座的一个ppt分享 1. MySQL的索引类型选择 2. MySQL数据结构分析 3. MySQL的引擎类型分析

    MySQL网络培训精品班-Inside君姜承尧

    MySQL 数据类型和SQL查询 开发 day008-MySQL 数据类型 day009-精通JSON类型 day010-Employees 临时表的创建 外键约束 day011-SQL语法之SELECT day012-子查询 INSERT UPDATE DELETE REPLACE day013-作业讲解一 Rank ...

    MySQL数据库查询优化

    从MySQL索引的角度出发,看各种SQL查询语句的优化怎么进行?(以前都是从语句的角度看怎么优化,现在站在索引的角度去总结SQL查询语句的优化) 预计时间1小时 第12课 表扫描与连接算法与MySQL多表连接优化实践 ...

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    3-MySQL索引优化生产案例讲解02 4-linux运维人员必须掌握的核心经验案例.avi MySQL数据库生产场景核心优化精讲 5-MySQL数据库硬件优化生产方案及细节精讲01.avi 6-MySQL数据库系统优化生产方案及细节精讲02.avi 7-...

    索引什么是索引.pdf

    【索引】什么是索引 1 什么是MySQL索引?...2 MySQL索引的类型 3 MySQL索引的使用场景 4 MySQL索引的最佳实践 5 总结 6 扩展知识: 6.1 索引的创建和删除: 6.2 复合索引: 6.3 索引的大小: 6.4 索引的优化:

    30导精选mysql面试题

    面试题范围:MySQL的架构、数据类型、存储引擎、索引和优化、SQL查询、备份和恢复、MySQL事物处理、MySQL安全性以及MySQL监控。 MySQL面试题适合软件开发人员、Web程序员、数据库管理员以及其他有关数据库的相关职位...

    MySQL性能优化的21个最佳实践--更多Java进阶

    1. 为查询缓存优化你的查询 3. 当只要一行数据时使用 LIMIT 1 4. 为搜索字段建索引 5. 在 Join 表的时候使用相当类型的例,并将其索引 8.

    C++程序设计实践项目——学生信息管理系统,基于Qt+MySQL.zip

    MySQL广泛应用于各种规模和类型的项目,包括但不限于: Web应用程序:作为众多网站和Web服务(如电子商务、社交媒体、内容管理系统等)的后台数据库。 数据分析与报表:与数据仓库技术结合,支持OLAP(在线分析...

    MySQL管理之道 性能调优、高可用与监控.part2.rar

    《mysql管理之道:性能调优、高可用与监控》由资深mysql专家撰写,以最新的mysql版本为基础,以构建高性能mysql服务器为核心,从故障诊断、表设计、sql优化、性能参数调优、mydumper逻辑、xtrabackup热备份与恢复、...

    MySQL性能优化的21个最佳实践.pdf

    5. 在 Join 表的时候使用相当类型的例,并将其索引 6. 千万不要 ORDER BY RAND() 7. 避免 SELECT * 8. 永远为每张表设置一个 ID 9. 使用 ENUM 而不是 VARCHAR 10. 从 PROCEDURE ANALYSE() 取得建议 ......等等

    MySQL面试题经典精华精确.zip

    这份资料不仅包括了各种类型的题目,还附带了丰富的配套资源,旨在帮助大家深入理解MySQL的各个方面。 面试题:涵盖了从基础概念到高级特性的各种问题,包括SQL语句、索引、存储过程、事务处理、性能优化等。 代码...

    MySQL面试题50道

    2、实践中如何优化MySQL? 答: 最好是按照以下顺序优化: 1、SQL 语句及索引的优化 2、数据库表结构的优化 3、系统配置的优化 4、硬件的优化 3、MySQL中有哪些不同的表格? 答: 共有5种类型的表格: 1、MyISAM 2...

    基于 MySQL Binlog 的 Elasticsearch 数据同步实践

    把需要检索的业务数据,统一放到一张MySQL 表中,这张中间表对应了业务需要的Elasticsearch 索引,每一列对应索引中的一个Mapping 字段。通过脚本以 Crontab 的方式,读取 MySQL 中间表中 UTime 大于上

    MySQL学习笔记3-数据库设计与优化.md

    本文首先介绍了数据库设计的几大原则,如规范化、完整性、选择数据类型等。然后重点概述了数据库性能优化的常见方法,如索引优化、查询优化、分区表、缓存等,并给出了示例代码。最后通过一个图书管理系统的数据库设计...

    PHP与MySQL程序设计(第四版)pdf扫描版

    16章到38章都会让你受益匪浅。至少在相比于只将基础,语法,使用,再加个小项目实践来说,这能让你学习到安全PHP编程,MVC与Zend框架,MySQL存储引擎和数据类型,存储过程,MySQL触发器,索引和搜索,事务等。

    MySQLDBA运维笔记.pdf

    mysql 总结........................................................................................................................................6 1.1 数据库的种类.......................................

    MySQL的10道经典面试题以及解题思路

    以上题目涵盖了MySQL的基础知识、数据类型、索引优化、SQL查询、JOIN操作、分页查询、事务处理、存储过程、视图以及备份与恢复等多个主题。 解答这些问题时,除了提供准确的答案,还应展示对MySQL原理和最佳实践的...

    mysql 单机数据库优化的一些实践

    本文试图描述单机数据库优化的一些实践,数据库基于mysql,如有不合理的地方,欢迎指正。 1、表结构优化 在开始做一个应用的时候,数据库的表结构设计往往会影响应用后期的性能,特别是用户量上来了以后的性能。...

    当谈SQL优化时谈些什么?

    常用的Mysql引擎是innodb,索引类型是B-Tree索引,增删改查等操作经常遇到的问题是“查”,查询又以索引为重点(没索引不是病,慢起来太要命)。踩过O2O优惠券、摇一摇周边两个业务的一些坑,当谈到SQL优化时,想...

    Eclipse开发入门与项目实践 源代码

    Eclipse开发入门与项目实践 Eclipse开发入门与项目实践 源代码 Eclipse开发入门与项目实践 源代码 Eclipse开发入门与项目实践 源代码 第一部分 开发入门 第1章 Eclipse概述及开发环境搭建 2 1.1 Eclipse概述 2...

Global site tag (gtag.js) - Google Analytics