去搜索,但没有找到这个具体问题的答案.如果我错过了,我深表歉意.

在下表中,我有一个MySQL主键

主键id(发票、项目)

在我的应用程序中,我也会经常自己选择"项目",而不是只选择"发票".我想我会从这些列的索引中受益.

当我定义以下内容时,MySQL不会抱怨:

INDEX (invoice), INDEX (item), 主键id(发票、项目)

但我没有看到任何证据(使用descripe——我知道如何查找的唯一方法)表明这两列已经建立了单独的索引.

所以问题是,组成主键的列是否会自动单独索引?还有,有没有比"描述"更好的方法来探索我的表的结构?

推荐答案

我不太熟悉mySql上索引的内部结构,但在我熟悉的两个数据库供应商产品(MsSQL、Oracle)上,索引是平衡树结构,其节点被组织为索引定义在(In the Sequence Defined)上的列的序列元组

因此,除非mySql做得非常不同(可能不是),否则任何需要按索引中的subset列进行过滤或排序的查询都可以使用任何复合索引can,只要列列表兼容,即如果,当按与完整索引中列的顺序列表相同的顺序排列时,是完整索引列集合的有序子集,它从实际索引序列的开头开始,除了结尾之外没有间隙...

换句话说,这意味着如果你在(a,b,c,d)上有一个索引,一个过滤(a),(a,b)或(a,b,c)的查询也可以使用该索引,但是一个需要过滤(b),或(c)或(b,c)的查询将无法使用该索引...

因此,在您的情况下,如果您经常需要仅对第item列进行筛选或排序,则需要在该列上单独添加另一个索引...

Mysql相关问答推荐

如何使用 Raw SQl / Laravel 进行累积计数 - Eloquent ORM

如何判断嵌套查询返回的元组中的每个条目是否相同?

按长度过滤 varbinary 字段

使用 ON DUPLICATE KEY 将列增加一定数量 MySQL NodeJS

为什么在有 BEGIN 和 END 时为存储过程指定分隔符?

将每组的总和除以总数

使用case查询并更新最后一条记录

MySQL 视图

服务器返回无效的时区.转到高级选项卡并手动设置 servertimezone 属性

如何在 MySQL 中进行正则表达式替换?

表 'DBNAME.hibernate_sequence' 不存在

导入 data.sql MySQL Docker 容器

拒绝访问;您需要(至少一个)超级权限才能执行此操作

SELECT 列表不在 GROUP BY 子句中并且包含非聚合列 .... 与 sql_mode=only_full_group_by 不兼容

如何向 MySQL 中的 ENUM 类型列添加更多成员?

加入与子查询

Spring Boot JPA 使用 Hibernate 在 TABLE 中插入大写名称

mysql查询中<>的含义是什么?

等于 (=) 和具有一个文字值的 IN 之间的性能差异

SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #3 不在 GROUP BY 子句中并且包含非聚合