今天在群里面遇到一个人问的问题
他只问了一个问题:为何查询了主键,却没有使用主键索引,因为我对这方面不是太了解,所以引出了如下几个问题
1、count(*)走了索引
count(*) count(1)会使用覆盖索引(Using index)
(Using index : 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候)
2、count(col)当col为索引字段并且where条件使用此字段时会走索引,否则不会
3、为什么默认使用了idx_createtime索引
试验方法:
(1)增加title索引,发现依旧使用createtime,而title的key_len为603,createtime为9
(2)去掉title索引,增加isDel索引,发现默认使用了isDel,key_len为2,且与主键索引相同,
结论:默认会使用key_len最小的索引,#遗留问题,为何普通索引和主键索引key_len相同而使用了普通索引
4、表没数据的情况下Impossible WHERE noticed after reading const tables
会出现这个情况,百度出来的结果是因为数据位空的原因,当不为空时会出现Using where;Using index
下面提供下表的创建:
CREATE TABLE `cms_content` ( `contentid` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(200) DEFAULT NULL, `xmlInfo` text, `xmlContent` mediumtext, `createTime` datetime DEFAULT NULL, `uploadTime` datetime DEFAULT NULL, `proposeSpecCode` varchar(10) DEFAULT NULL, `isDel` bit(1) DEFAULT NULL, `isUpdate` int(11) DEFAULT '0', PRIMARY KEY (`contentid`), KEY `pk_content_proposeSpecCode` (`proposeSpecCode`), KEY `idx_createtime` (`createTime`) )
测试用到的sql
EXPLAIN SELECT * FROM cms_content;
EXPLAIN SELECT contentid FROM cms_content;
EXPLAIN SELECT title FROM cms_content;##不会索引
EXPLAIN SELECT COUNT(*) FROM cms_content;
EXPLAIN SELECT COUNT(1) FROM cms_content;
EXPLAIN SELECT COUNT(*) FROM cms_content WHERE title='11';
EXPLAIN SELECT COUNT(*) FROM cms_content WHERE contentid=11;
EXPLAIN SELECT COUNT(contentid) FROM cms_content;
EXPLAIN SELECT COUNT(isDel) FROM cms_content
相关推荐
- 组合索引中有列值为NULL。 - 在一个SELECT语句中,索引只能使用一次(如在WHERE中使用后,在ORDER BY中不再有效)。 - 在查询条件中使用不等于符号(包括<、>、!=)可能导致索引失效。 通过理解MySQL及其索引的...
上述场景中,用户遇到了一个问题:对一个10G以上的单表`user_access_xx_xx`执行`SELECT COUNT(DISTINCT nick)`以统计唯一用户访问(UV)时,即使有`nick`字段的索引,执行计划仍然显示全索引扫描,导致服务器性能受...
MySQL数据库在日常使用中会遇到各种问题,其中索引优化是提升数据库性能的关键环节。本文将探讨MySQL的一些常见问题,特别是与索引相关的优化策略。 1. 关于MySQL `count(distinct)` 的逻辑bug 在执行`count...
虽然MySQL可以在含有NULL的列上使用索引,但是NULL和其他数据在索引中的处理方式不同。NULL是一个特殊的值,它 Conceptually means “a missing unknown value” and it is treated somewhat differently from other...
本文分析了MySQL中字符串索引对update的影响。分享给大家供大家参考,具体如下: 对某一个类型为varchar的字段添加前缀索引后,基于该子段的条件查询时间基本大幅下降;但对于update操作,所耗的时间却急剧上升,...
MySQL是世界上最流行的开源关系型数据库管理系统之一,其面试题涵盖了多个方面,包括表连接类型、COUNT函数的不同用法、索引类型以及优化策略等。以下是对这些知识点的详细阐述: 1. **表连接类型** - **内连接...
1.2 关于本手册 1.2.1 本手册中使用的约定 1.3 MySQL的历史 1.4 MySQL的主要特征 1.5 MySQL稳定性? 1.6 顺应2000年 1.7 SQL一般信息和教程 1.8 有用的MySQL相关链接 ...
MySQL中的InnoDB存储引擎在处理`COUNT(*)`查询时,会根据不同的索引类型和查询条件来决定执行效率。在优化`COUNT(*)`查询时,理解InnoDB的聚集索引(Clustered Index)和辅助索引(Secondary Index)的工作原理至关...
松散索引扫描适用于GROUP BY条件是索引中最左前缀的情况,即使WHERE子句中没有使用到所有的索引字段。在使用这种扫描方法时,MySQL仅需遍历索引的一部分,而不是整个索引,从而减少I/O操作。例如,对于一个索引idx...
若允许为空,需设定默认值,避免出现NULL值,因为NULL值在索引中处理方式特殊。 - **默认值**:即使字段允许为空,也应设定默认值,确保新插入的记录有明确的值。 2. **外键与索引**: - **外键索引**:当字段...
当使用COUNT(col)并涉及带有索引的列时,MySQL可能能够直接从索引中获取非NULL值的数量,而无需扫描整个表。这通常比扫描整个表更快,尤其是在大表中。 总结来说,COUNT(*)、COUNT(1)和COUNT(col)的主要区别在于...
冗余索引常见于添加新索引时,尤其是当新索引只是现有索引的扩展,如从`(A)`扩展到`(A,B)`,或在InnoDB中添加包含主键的索引 `(A,ID)`,因为主键已经在二级索引中包含。 冗余索引并不总是坏事,有时出于性能考虑,...
+ 1.2.1 本手册中使用的约定 o 1.3 MySQL的历史 o 1.4 MySQL的主要特征 o 1.5 MySQL稳定性? o 1.6 顺应2000年 o 1.7 SQL一般信息和教程 o 1.8 有用的MySQL相关链接 * 2 MySQL 邮件列表及如何提问或报告错误...
总的来说,理解`NULL`值在MySQL索引中的行为是非常重要的,这有助于我们更好地设计数据库和编写高效的查询语句。在实际工作中,应尽可能避免无谓的`NULL`值,尤其是在那些经常用于查询条件的列中,以确保最佳的性能...
在 MySQL 中,COUNT(*) 函数的参数可以是字段名,也可以是其他任意表达式。例如,SELECT COUNT(*) FROM table_name; SELECT COUNT(1) FROM table_name; SELECT COUNT(主键) FROM table_name; 等。 COUNT(*) 函数的...
在MySQL数据库中,`DISTINCT` 和 `COUNT(*)` 是两种常见的SQL查询关键字,它们各自有不同的用途和场景。本文将详细探讨这两种方法的使用方法及其差异。 首先,`DISTINCT` 关键字用于从查询结果中去除重复的记录。在...