mysql一张表可以建20个索引
时间: 2023-07-14 14:11:58 浏览: 110
在 MySQL 中,每张表的索引数量是有限制的,这个限制取决于存储引擎类型和操作系统的限制。对于 InnoDB 存储引擎和 Linux 操作系统,每张表的索引数量默认限制为 64,但可以通过修改配置文件来增加这个限制。
建立索引可以提高查询效率,但是过多的索引也会带来一些负面影响,如增加写操作的成本、占用更多的存储空间等。因此,在建立索引时需要考虑索引的数量和索引列的选择。一般来说,对于一个表,最好只建立必要的索引,不要过度索引。如果需要建立多个索引,也要合理选择索引列,避免重复索引和无效索引的出现。
相关问题
mysql varchar 索引
### 如何在 MySQL 中为 VARCHAR 字段创建索引
#### 创建索引的一般方法
为了提高查询效率,在 `VARCHAR` 类型字段上可以创建索引来加速数据检索操作。可以通过多种方式实现这一目标:
- **创建表时定义索引**
当首次构建表格结构时,可以在声明列的同时为其设置索引属性。例如,下面展示了如何在一个新表中为 `email` 列建立名为 `idx_email` 的普通索引[^4]。
```sql
CREATE TABLE users (
id INT AUTO_INCREMENT,
email VARCHAR(255),
INDEX idx_email (email),
PRIMARY KEY(id)
);
```
- **对现有表添加索引**
如果已经存在一张未加索引的表,则可通过 `ALTER TABLE` 命令向该表追加新的索引项。这不会影响当前存储的数据记录。
```sql
ALTER TABLE users ADD INDEX idx_email (email);
```
#### 注意事项
##### 索引长度限制
MySQL 对于每个索引条目的大小设定了严格的界限——单个索引行的最大允许尺寸不超过767字节。这意味着如果尝试为非常长的字符串类型的列(如 `VARCHAR` 或者 `TEXT`)创建索引的话,可能会遇到超出此限制造成失败的情况[^2]。
为了避免此类问题的发生,建议采取以下措施之一:
- 减少字符集编码所占用的空间;比如从多字节 UTF8MB4 改回较短的 ASCII 编码;
- 只针对前缀部分而非整个字段内容建索引,即只取定长子串作为键值参与排序比较运算。
##### 处理 NULL 值的影响
对于包含可为空(`NULL`)标记位的列来说,默认情况下它们会被视为不同于任何其他具体数值的存在形式,并且能够被纳入到唯一性约束之内。然而有时业务逻辑不允许这种情况发生,因此有必要考虑采用特殊手段解决这个问题。一种常见做法就是利用触发器机制或者引入虚拟计算得出的新辅助列来进行间接控制[^3]。
```sql
-- 使用生成字段处理 null 值情况下的唯一索引
CREATE TABLE user_profiles(
profile_id BIGINT NOT NULL AUTO_INCREMENT,
username VARCHAR(100) DEFAULT NULL,
generated_username AS (IF(username IS NULL,'default',username)) STORED,
UNIQUE(generated_username),
PRIMARY KEY(profile_id)
);
INSERT INTO user_profiles(username) VALUES ('alice'),('bob'),(null),(null); -- 后两个插入会因违反唯一性而报错
```
mysql 索引个数上限 csdn
### 关于 MySQL 紗引数量的上限
在 MySQL 数据库中,索引的数量并没有一个固定的全局限制,而是受到多种因素的影响。这些因素包括但不限于存储引擎的选择、操作系统本身的文件系统限制以及硬件资源等。
对于 InnoDB 存储引擎而言,官方文档并未明确规定每张表能够创建的最大索引数量,但存在一些隐含约束条件。例如,在实际应用中发现,当一张表上定义过多的索引时,可能会因为内存消耗过大而导致性能下降[^1]。此外,需要注意的是,尽管理论上可以创建大量索引,但在实践中应权衡查询优化与写入操作之间的平衡关系。
另外值得注意的一个方面是关于单个索引列长度方面的规定:MyISAM 表允许设置更长的单一字段作为其组成部分之一;而相比之下,InnoDB 则相对严格得多 —— 单一字符串型字段构成次级索引部分不得超过 767 字节 (具体取决于字符集编码方式),除非启用了动态或压缩行格式选项,则该数值可扩展至 3072 字节范围之内[^2]。
至于为何某些情况下即使建立了合适类型的辅助性结构也可能无法正常发挥作用?这是因为如果SQL语句里包含了逻辑运算符OR连接起来的不同条件表达式,并且其中一个涉及到了未加标记处理过的普通属性而非特别指定好的已建好相应加速机制版本的话,那么整个检索过程就不得不退化回全盘扫描模式去了[^4]。
综述以上几点可以看出虽然技术层面给予开发者较大灵活性来自由决定如何构建最适合自己业务场景需求的数据访问路径设计方案,但从长远维护成本角度考虑还是建议遵循最佳实践指南来合理规划使用次数频率较高的那些核心维度方向上去集中精力打造高效能表现出来的组合形式出来即可满足绝大部分日常运营管理工作当中遇到的各种复杂情况挑战了!
```sql
-- 示例代码展示如何查看当前数据库中的所有索引信息
SELECT TABLE_NAME,COLUMN_NAME,INDEX_NAME,NON_UNIQUE
FROM INFORMATION_SCHEMA.STATISTICS
WHERE table_schema='your_database_name';
```
阅读全文
相关推荐















