原来认为在MySQL中是没有聚集索引的,可是今天在看《High Performance MySQL 2nd》时发现自己原来的观点是不正确的,在MySQL中如果使用Innodb做为存储引擎的话其主键就是聚集索引,也就是说数据是按照主键的顺序存放的。我们可以通过下面的测试来看到这一点:mysql> create table t (ID int(10) unsigned NOT NULL,title varchar(100),primary key(id)) engine=innodb;Query OK, 0 rows affected (0.01 sec)mysql> insert into t values(10,'10');Query OK, 1 row affected (0.00 sec)mysql> insert into t values(8,'8');Query OK, 1 row affected (0.00 sec)mysql> select * from t;+----+-------+| ID | title |+----+-------+| 8 | 8 || 10 | 10 |+----+-------+2 rows in set (0.00 sec)mysql> insert into t values(9,'9');Query OK, 1 row affected (0.01 sec)mysql> select * from t;+----+-------+| ID | title |+----+-------+| 8 | 8 || 9 | 9 || 10 | 10 |+----+-------+可以看出来在innodb中指定了主键后数据的存储顺序就是主键的顺序,如果不指定主键则如下:mysql> create table t2(id int,title varchar(10)) engine=innodb;Query OK, 0 rows affected (0.03 sec)mysql> insert into t2 values(8,'8');Query OK, 1 row affected (0.01 sec)mysql> insert into t2 values(10,'10');Query OK, 1 row affected (0.01 sec)mysql> select * from t2;+------+-------+| id | title |+------+-------+| 8 | 8 || 10 | 10 |+------+-------+2 rows in set (0.01 sec)mysql> insert into t2 values(7,'7');Query OK, 1 row affected (0.00 sec)mysql> select * from t2;+------+-------+| id | title |+------+-------+| 8 | 8 || 10 | 10 || 7 | 7 |+------+-------+3 rows in set (0.01 sec)在没有主键的情况下,数据的存储顺序是插入数据的顺序。同时也可以用同样的方法检验出在MyISAM表中的主键并不是聚集索引mysql> truncate table t;Query OK, 0 rows affected (0.01 sec)mysql> truncate table t2;Query OK, 0 rows affected (0.00 sec)mysql> alter table t engine=myisam;Query OK, 0 rows affected (0.03 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> alter table t2 engine=myisam;Query OK, 0 rows affected (0.05 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> show create table t;+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------+| Table | Create Table |+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------+| t | CREATE TABLE `t` ( `ID` int(10) unsigned NOT NULL, `title` varchar(100) DEFAULT NULL, PRIMARY KEY (`ID`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 |+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.00 sec)mysql> show create table t2;+-------+--------------------------------------------------------------------------------------------------------------------------+| Table | Create Table |+-------+--------------------------------------------------------------------------------------------------------------------------+| t2 | CREATE TABLE `t2` ( `id` int(11) DEFAULT NULL, `title` varchar(10) DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8 |+-------+--------------------------------------------------------------------------------------------------------------------------+1 row in set (0.00 sec)mysql> insert into t values(7,'7');Query OK, 1 row affected (0.00 sec)mysql> insert into t values(10,'10');Query OK, 1 row affected (0.00 sec)mysql> select * from t;+----+-------+| ID | title |+----+-------+| 7 | 7 || 10 | 10 |+----+-------+2 rows in set (0.00 sec)mysql> insert into t values(8,'8');Query OK, 1 row affected (0.01 sec)mysql> select * from t;+----+-------+| ID | title |+----+-------+| 7 | 7 || 10 | 10 || 8 | 8 |+----+-------+3 rows in set (0.00 sec)mysql> insert into t2 values(10,'10');Query OK, 1 row affected (0.01 sec)mysql> insert into t2 values(7,'7');Query OK, 1 row affected (0.01 sec)mysql> select * from t2;+------+-------+| id | title |+------+-------+| 10 | 10 || 7 | 7 |+------+-------+2 rows in set (0.01 sec)由此可见在Innodb中使用主键一定要特别的注意,如果使用随机数据做为主键的话每可能会造成大量的数据移动从而减低服务器的性能
分享到:
相关推荐
MySQL索引 聚集索引 如果你想了解MySQL索引查询优化,你首先应该对MySQL数据组织结构、B-Tree索引、聚集索引,次要索引有一定的了解,才能够更好地理解MySQL查询优化行为。这里主要探讨MySQL InnoDB的聚集索引。
### MySQL数据库及索引详解 #### 一、MySQL简介与数据库发展 MySQL是一款非常流行的开源关系型数据库管理系统,由瑞典MySQL AB公司开发。它以其高性能、稳定性和易用性著称,广泛应用于Web应用程序和企业级系统中...
MySQL中的连续聚合是一种针对有序数据集进行的聚合操作,它特别适用于时间序列分析,例如跟踪随时间变化的趋势或计算累计值。在本篇分析中,我们将深入探讨连续聚合的原理、功能、使用方法以及相关操作注意事项,并...
在使用GROUP BY和ORDER BY时,如果未指定的所有列都在索引中,且没有其他非聚合函数,MySQL可能会使用索引。否则,它可能需要进行排序或临时表操作,导致索引失效。 **10. 分组后过滤(HAVING子句)** 在GROUP BY...
└26.MySQL高级SQL技巧日期函数与聚合函数.mp4 ├第二天视频 01.MySQL高级今日内容.mp4 02.MySQL高级体系结构.avi 03.MySQL高级存储引擎概述.avi 04.MySQL高级存储引擎特性.avi 05.MySQL高级存储引擎InnoDB特性.avi ...
3. **优化分组和聚合操作**:索引可以改善GROUP BY和ORDER BY子句的性能,从而更快地完成复杂查询任务。 #### 创建和使用索引的实践案例 以下是一个创建索引的具体示例: ```sql -- 创建一个表 CREATE TABLE ...
在这个“mysql语句集合包括模糊查询索引函数”中,我们将深入探讨SQL中的关键概念,特别是与模糊查询、索引和函数相关的知识。 首先,SQL语句主要分为四大类:SELECT(查询)、INSERT(插入)、UPDATE(更新)和...
索引优化是MySQL性能提升的关键。索引允许数据库快速定位和访问数据,而无需全表扫描。在这个数据集中,你可以尝试创建不同类型的索引,如主键索引、唯一索引、普通索引、全文索引以及复合索引,并通过EXPLAIN命令来...
从MySQL 5.0版本开始,松散索引扫描成为可能,特别是在涉及聚合函数如MIN()和MAX()的GROUP BY查询中。例如: ```sql mysql> EXPLAIN SELECT actor_id, MAX(film_id) FROM sakila.film_actor GROUP BY actor_id; ```...
MySQL中的GROUP BY语句用于对数据进行分组和聚合,通常与聚合函数(如COUNT、SUM、AVG等)一起使用。在处理大数据量时,优化GROUP BY操作至关重要,因为这直接影响查询性能。MySQL提供了几种优化策略,其中两种是...
8. **更大的表和索引**:MySQL 5.1 增加了单表的最大记录数和索引长度,适应了大数据量的需求。 9. **XML 支持**:MySQL 5.1 提供了对 XML 文档的存储和检索功能,方便与 XML 应用程序集成。 10. **安全性和认证**...
在给定的例子中,当尝试获取索引值为33的文章的前后两条记录时,原查询使用了嵌套的SELECT来找出符合条件的ID,但因为涉及到了非聚合列,所以会报错。解决方法是关闭`ONLY_FULL_GROUP_BY`或重构查询,以满足新的SQL...
1. **InnoDB 引擎优化**:InnoDB 作为 MySQL 默认的事务处理引擎,在8.4.0中可能进行了性能提升,包括更快的索引插入、更高效的锁定机制和更好的内存管理。 2. **窗口函数**:MySQL 8.x 引入了 SQL 标准的窗口函数...
在MySQL中,聚合函数`COUNT()`是一个非常常用的操作,用于统计特定条件下的数据数量。本文主要探讨了在Windows 10环境下,使用MySQL 5.7.12-log版本时,`COUNT()`函数的使用方法及其性能优化策略。 首先,`COUNT()`...
- **索引优化**:根据查询模式创建合适的索引,提高查询速度。 - **错误日志**:查看错误日志(error.log)可以帮助诊断和解决运行时问题。 总的来说,"mysql-8.0.33-winx64.zip"提供的安装包为Windows用户提供了...
MySQL索引是数据库管理系统中用于加速数据检索的关键结构。索引的选择和管理对于数据库性能至关重要。以下是关于如何选择建立索引、可能导致索引失效的原因以及使用索引时应注意的事项的详细说明。 **适合建立索引...
它支持各种选择条件(WHERE子句)、排序(ORDER BY子句)、分组(GROUP BY子句)和聚合函数(如COUNT(), SUM(), AVG(), MAX(), MIN())。 3. 更新数据:UPDATE语句用于修改已存在的记录。 4. 删除数据:DELETE FROM...
MySQL 8.0支持SELECT、INSERT、UPDATE、DELETE等基本操作,以及JOIN、子查询、聚合函数(如COUNT、SUM、AVG)、窗口函数等高级特性。 3. **存储引擎**:MySQL支持多种存储引擎,如InnoDB(默认,支持事务处理和行级...