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)中对数据进行排序,如果内存装载不下,它会将磁盘上的数据进行分块,再对各个数据块进行排序,然后将各个块合并成有序的结果集(实际上就是外排序)
相关推荐
讲座的一个ppt分享 1. MySQL的索引类型选择 2. MySQL数据结构分析 3. MySQL的引擎类型分析
MySQL 数据类型和SQL查询 开发 day008-MySQL 数据类型 day009-精通JSON类型 day010-Employees 临时表的创建 外键约束 day011-SQL语法之SELECT day012-子查询 INSERT UPDATE DELETE REPLACE day013-作业讲解一 Rank ...
从MySQL索引的角度出发,看各种SQL查询语句的优化怎么进行?(以前都是从语句的角度看怎么优化,现在站在索引的角度去总结SQL查询语句的优化) 预计时间1小时 第12课 表扫描与连接算法与MySQL多表连接优化实践 ...
3-MySQL索引优化生产案例讲解02 4-linux运维人员必须掌握的核心经验案例.avi MySQL数据库生产场景核心优化精讲 5-MySQL数据库硬件优化生产方案及细节精讲01.avi 6-MySQL数据库系统优化生产方案及细节精讲02.avi 7-...
【索引】什么是索引 1 什么是MySQL索引?...2 MySQL索引的类型 3 MySQL索引的使用场景 4 MySQL索引的最佳实践 5 总结 6 扩展知识: 6.1 索引的创建和删除: 6.2 复合索引: 6.3 索引的大小: 6.4 索引的优化:
面试题范围:MySQL的架构、数据类型、存储引擎、索引和优化、SQL查询、备份和恢复、MySQL事物处理、MySQL安全性以及MySQL监控。 MySQL面试题适合软件开发人员、Web程序员、数据库管理员以及其他有关数据库的相关职位...
1. 为查询缓存优化你的查询 3. 当只要一行数据时使用 LIMIT 1 4. 为搜索字段建索引 5. 在 Join 表的时候使用相当类型的例,并将其索引 8.
MySQL广泛应用于各种规模和类型的项目,包括但不限于: Web应用程序:作为众多网站和Web服务(如电子商务、社交媒体、内容管理系统等)的后台数据库。 数据分析与报表:与数据仓库技术结合,支持OLAP(在线分析...
《mysql管理之道:性能调优、高可用与监控》由资深mysql专家撰写,以最新的mysql版本为基础,以构建高性能mysql服务器为核心,从故障诊断、表设计、sql优化、性能参数调优、mydumper逻辑、xtrabackup热备份与恢复、...
5. 在 Join 表的时候使用相当类型的例,并将其索引 6. 千万不要 ORDER BY RAND() 7. 避免 SELECT * 8. 永远为每张表设置一个 ID 9. 使用 ENUM 而不是 VARCHAR 10. 从 PROCEDURE ANALYSE() 取得建议 ......等等
这份资料不仅包括了各种类型的题目,还附带了丰富的配套资源,旨在帮助大家深入理解MySQL的各个方面。 面试题:涵盖了从基础概念到高级特性的各种问题,包括SQL语句、索引、存储过程、事务处理、性能优化等。 代码...
2、实践中如何优化MySQL? 答: 最好是按照以下顺序优化: 1、SQL 语句及索引的优化 2、数据库表结构的优化 3、系统配置的优化 4、硬件的优化 3、MySQL中有哪些不同的表格? 答: 共有5种类型的表格: 1、MyISAM 2...
把需要检索的业务数据,统一放到一张MySQL 表中,这张中间表对应了业务需要的Elasticsearch 索引,每一列对应索引中的一个Mapping 字段。通过脚本以 Crontab 的方式,读取 MySQL 中间表中 UTime 大于上
本文首先介绍了数据库设计的几大原则,如规范化、完整性、选择数据类型等。然后重点概述了数据库性能优化的常见方法,如索引优化、查询优化、分区表、缓存等,并给出了示例代码。最后通过一个图书管理系统的数据库设计...
16章到38章都会让你受益匪浅。至少在相比于只将基础,语法,使用,再加个小项目实践来说,这能让你学习到安全PHP编程,MVC与Zend框架,MySQL存储引擎和数据类型,存储过程,MySQL触发器,索引和搜索,事务等。
mysql 总结........................................................................................................................................6 1.1 数据库的种类.......................................
以上题目涵盖了MySQL的基础知识、数据类型、索引优化、SQL查询、JOIN操作、分页查询、事务处理、存储过程、视图以及备份与恢复等多个主题。 解答这些问题时,除了提供准确的答案,还应展示对MySQL原理和最佳实践的...
本文试图描述单机数据库优化的一些实践,数据库基于mysql,如有不合理的地方,欢迎指正。 1、表结构优化 在开始做一个应用的时候,数据库的表结构设计往往会影响应用后期的性能,特别是用户量上来了以后的性能。...
常用的Mysql引擎是innodb,索引类型是B-Tree索引,增删改查等操作经常遇到的问题是“查”,查询又以索引为重点(没索引不是病,慢起来太要命)。踩过O2O优惠券、摇一摇周边两个业务的一些坑,当谈到SQL优化时,想...
Eclipse开发入门与项目实践 Eclipse开发入门与项目实践 源代码 Eclipse开发入门与项目实践 源代码 Eclipse开发入门与项目实践 源代码 第一部分 开发入门 第1章 Eclipse概述及开发环境搭建 2 1.1 Eclipse概述 2...