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)中对数据进行排序,如果内存装载不下,它会将磁盘上的数据进行分块,再对各个数据块进行排序,然后将各个块合并成有序的结果集(实际上就是外排序)
相关推荐
4. **JSON支持**:增强了对JSON数据类型的处理,可以进行JSON文档的索引、查询和更新。 5. **安全增强**:增加了密码加密和身份验证插件,提升了安全性。 6. **空间数据类型**:对GIS(地理信息系统)的支持得到了...
- **性能提升**:在这一版本中,MySQL数据库进行了大量优化,包括更快的查询速度、更高效的索引处理等。 - **安全性增强**:支持更强的身份验证协议,如caching_sha2_password,提供了更高的安全性。 - **JSON...
MySQL是世界上最受欢迎的关系型数据库管理系统(RDBMS)之一,尤其在Web应用程序中广泛应用。5.5.28是MySQL的一个稳定版本,提供了许多增强功能和优化,旨在提高性能、可扩展性和安全性。本篇文章将深入探讨MySQL ...
MySQL Connector/J 8.0.24 是MySQL数据库与Java应用程序之间的重要桥梁,它是一个用于连接Java...最后,了解并遵循MySQL的最佳实践,如合理设计数据库架构、索引管理和事务处理,有助于提升整个系统的稳定性和效率。
8.0版本带来了许多性能和功能上的提升,包括InnoDB存储引擎的优化,支持更大范围的索引类型,以及更强大的JSON处理能力。此外,它还提供了增强的安全性,例如默认的加密连接和更严格的密码策略。 在MySQL 8.0.23.0...
1. **B-Tree索引**:最常用的索引类型,适用于等值查询,支持升序和降序。 2. **哈希索引**:主要用于内存中的MyISAM表,提供快速的等值查找,但不支持范围查询。 3. **全文索引**:用于文本搜索,提供更复杂的模糊...
B+树索引是MySQL中最常用的索引类型之一,其特点是所有叶子节点都指向物理磁盘地址,这使得查找过程非常高效。 #### 三、性能调优 性能调优是MySQL进阶学习的重要部分,涉及到多个方面的调整和优化。 - **SQL语句...
MySQL是世界上最受欢迎的开源关系型数据库管理系统之一,尤其在Web应用程序中被广泛使用。这个压缩包文件"mysql-...正确安装并配置MySQL 5.7.17,结合良好的安全和性能实践,将为业务提供稳定且高效的数据库服务。
1. **元数据同步**:MySQL-Bridge 主要负责将 MySQL 数据库的表结构、索引、视图等元数据实时同步到 Atlas 平台,确保 Atlas 中的数据模型与 MySQL 实例保持一致。 2. **变更数据捕获**:除了基础的元数据同步,...
总结,MySQL 5.5.18-win32的安装和使用教程涵盖了数据库管理、SQL操作、用户权限、备份恢复、性能优化等多个方面,旨在帮助用户全面掌握MySQL的基本操作和最佳实践。通过这个教程,无论是新手还是经验丰富的开发者,...
### MySQL索引最佳实践 #### 理解索引的重要性 在数据库管理中,索引是一种数据结构,用于提高查询速度。它对于开发者和数据库管理员(DBA)来说至关重要。索引选择不当可能会导致生产环境中的诸多问题。尽管索引...
1. **性能提升**: MySQL 5.7.24引入了InnoDB存储引擎的性能改进,包括更快的索引插入和查询优化。这得益于更好的内存管理、并行插入和更高效的缓冲池策略。 2. **JSON支持**: 该版本增强了对JSON数据类型的支持,...
在使用MySQL 5.7.28时,还需要考虑安全性和最佳实践。例如,应该定期备份数据库,以防止数据丢失;为不同的用户分配最小权限,遵循最小权限原则;并定期更新到最新版本以获取最新的安全补丁。 总的来说,"mysql-...
安装“mysql-5.5.40-win64.msi”文件时,用户将被引导完成一系列配置步骤,包括设置 root 用户密码、选择服务器类型(开发、生产或服务器群集)、以及选择是否安装额外的组件,如 MySQL Workbench(数据库管理和设计...
#### 二、MySQL索引类型详解 ##### 1. B-Tree索引 - **定义**:B-Tree(平衡树)是最常见的索引类型,在大多数情况下使用的索引都属于此类。B-Tree能够支持范围查找、前缀查找以及等值查找等多种操作。 - **特点**...
- **InnoDB存储引擎增强**:MySQL 5.5对InnoDB存储引擎进行了大量优化,包括更好的并发处理能力,支持更大的行内数据存储,以及更高效的全文索引。 - **Performance Schema**:引入了性能模式,提供了一个无侵入式...
最后,MySQL的性能调优是一个深入的话题,涉及到索引优化、查询优化、内存设置和配置文件的调整。通过分析查询日志、使用EXPLAIN计划和调整服务器参数,可以提高数据库的响应速度和整体性能。 总的来说,"mysql-...
2. **全文搜索**:MySQL 5.6增强了全文索引功能,支持更多的分词器和更精确的匹配,提升了搜索体验。 3. **分区表**:在这一版本中,分区表功能得到了加强,支持更多类型的分区策略,如线性哈希分区,这有助于大型...
它还支持更多索引类型,如全文索引,以及更大的表空间。 2. **并行复制**:MySQL 5.5引入了半同步复制,确保至少一个从库接收到主库的更新后,主库才确认事务。这提高了数据的一致性。 3. **性能优化**:通过优化...