MySQL一个索引最多有多少个列?真实的测试例子

MySQL一个索引最多有多少个列?
最多16列。

 

create table test (
  f1 int,
  f2 int,
  f3 int,
  f4 int,
  f5 int,
  f6 int,
  f7 int,
  f8 int,
  f9 int,
  f10 int,
  f11 int,
  f12 int,
  f13 int,
  f14 int,
  f15 int,
  f16 int,
  f17 int
);

create index idx_test_16 on test (f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16);
create index idx_test_17 on test (f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17);

 

运行结果如下:


mysql> create table test (
    ->   f1 int,
    ->   f2 int,
    ->   f3 int,
    ->   f4 int,
    ->   f5 int,
    ->   f6 int,
    ->   f7 int,
    ->   f8 int,
    ->   f9 int,
    ->   f10 int,
    ->   f11 int,
    ->   f12 int,
    ->   f13 int,
    ->   f14 int,
    ->   f15 int,
    ->   f16 int,
    ->   f17 int
    -> );
Query OK, 0 rows affected (0.06 sec)

mysql>
mysql> create index idx_test_16 on test (f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> create index idx_test_17 on test (f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17);
ERROR 1070 (42000): Too many key parts specified; max 16 parts allowed
mysql>

### MySQL 三表连接查询优化与索引使用 在处理涉及多个表的复杂查询时,MySQL 的查询优化器会尝试找到最优执行计划来提高效率。当涉及到三个或更多表格之间的连接操作时,合理利用索引可以显著提升查询性能。 #### 辅助索引的选择依据 对于 `COUNT(id)` 这样的聚合函数,在某些情况下 MySQL 可能会选择辅助索引来代替主键聚簇索引进行计算。这是因为二级索引通常只包含指向实际记录位置的信息以及被索引数据,因此其大小往往小于完整的行数据集,从而使得扫描所需时间减少[^1]。 #### Hash Join的应用场景 自 MySQL 8.0 版本起引入了哈希连接(Hash Join),它可以在特定条件下替代传统的嵌套循环连接(Nested Loop Join)。特别是当两个表之间存在大量重复值或者其中一个表非常小时,采用哈希连接能够带来更好的性能表现[^2]。 #### 多表JOIN的最佳实践建议 为了使 MySQL 更有效地完成多表 JOIN 操作: - **关联字段加索引**:确保参与 join 条件中的每一侧都已创建适当类型的索引; - **选择合适的驱动表**:尽可能让较小的一方作为外层循环的基础,即所谓的“小表驱动大表”。这可以通过 STRAIGHT_JOIN 提示强制指定顺序,避免优化器错误估计而选择了次优方案[^3]; - **考虑覆盖索引**:如果可能的话,构建复合索引以满足整个 SELECT 表的需求,这样即使不访问原始表也能获取到全部必要信息; 下面是一个简单的例子展示如何通过添加索引来改善三表联接查询的速度: 假设有一个订单系统包含客户 (`customers`)、产品(`products`) 和订单详情(`order_items`) 三个关系型数据库表。要找出某个时间段内购买某类商品最多的前五位顾客名单及其消费金额总和。 ```sql SELECT c.customer_name, SUM(oi.quantity * oi.unit_price) AS total_spent FROM customers c INNER JOIN orders o ON c.id = o.customer_id -- 客户ID上的索引加速查找 INNER JOIN order_items oi ON o.order_id = oi.order_id -- 订单ID上的索引同样重要 WHERE DATE(o.purchase_date) BETWEEN 'start-date' AND 'end-date' AND p.product_category IN ('category-name') GROUP BY c.customer_name ORDER BY total_spent DESC LIMIT 5; ``` 在这个 SQL 中,`customer_id`, `order_id` 都应当建立相应的单索引,而对于过滤条件中使用的日期范围和类别名称,则可以根据实际情况决定是否需要额外增加组合索引或是全文搜索引擎的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值