【问题标题】:multi-to-multi indexing issue, mysql多对多索引问题,mysql
【发布时间】:2017-09-10 18:13:45
【问题描述】:

我有一个多对多表,这将有数百万行。让我用一个例子来描述我的困惑。

示例:

表:car_dealer_rel

选择:1

columns: car_id: int unsigned, dealer_id: int unsigned
index on: car_id, dealer_id

car_id|dealer_id
-------|---------
1      | 1
1      | 2
....
  • sub-opt:1:在这里我可以在两列上都有一个索引。
  • sub-opt:2:2 列上的一个组合索引。

选择-2:

一列表格

col: car_id_dealer_id: varchar:21
index on: PKI on this single column.

这里的想法是将值设置为:car_id.dealer_id 并搜索为%.xxx and or xxx.%

car_id_dealer_id
----------------
1.1
1.2
1.15
2.10
...
...

在数百万条记录之后会更快:

  1. 读取
  2. 添加/更新/删除。

我是 MySQL 新手,感谢所有帮助。

【问题讨论】:

  • 第一个是正确的 .. 永远不要使用组合值 .. 就像在第二个示例中一样 .. 使用分离列作为分离值 .. 您可以轻松添加复合索引

标签: mysql multiple-columns


【解决方案1】:

第一个

car_id|dealer_id
-------|---------
1      | 1
1      | 2

您可以轻松地为双方创建复合索引

create index  ind1 on  car_dealer_rel (car_id,dealer_id ); 

create index  ind2 on  car_dealer_rel (dealer_id, car_id ); 

工作速度非常快

您可以轻松地在这两种意义上进行过滤

 where car_id =  your_value  

where dealer_id = another_value 

或同时使用

使用第二个你不能轻易做到这一点(你需要经常进行字符串操作,这不会让你使用索引)并且在某些情况下你不能使用 sql

对于更新、插入和删除,性能几乎保持不变

【讨论】:

  • 索引 ind2 不需要是复合索引以节省空间,因为即使不包含 car_id 列,索引 ind1ind2 都可以满足 car_id 和 @987654331 的过滤@、car_id 单独或 dealer_id 单独。
  • 不是真的因为第一个列可以用在 where 和第二个作为 infor for select .. 避免访问整个表 ..
  • 我需要同时使用两列进行搜索。这是多对多的,因此行是唯一的(car_id+dealer_id),但对于给定的列,值会重复。
  • 那么你可以用索引解决所有问题并减少对表的访问这比索引+表访问要快得多..这是复合索引双方的另一个很好的理由(最终你可以强制使用一个索引而不是另一个)..
  • More tips 在多对多映射表上。
【解决方案2】:

这取决于您使用的实际查询,我建议先运行EXPLAIN,其中包含相当多的虚拟数据,以了解 MySQL 将如何执行您的查询。

但如果您要单独按列car_idcar_id dealer_id 查找记录,则可以使用复合索引(car_iddealer_id)。

如果您还想单独通过dealer_id 查找,可以在dealer_id 列上添加附加索引。

您的单列表选项不是很好,因为

  • 您无法通过dealer_id 快速找到行。

  • 表架构未规范化。

【讨论】:

    猜你喜欢
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    相关资源
    最近更新 更多