2张桌子:

countries:
  id
  short_name ("GE", "AR"...)
  long_name
  ....

banks:
  id
  name ("NATIONAL BANK OF COUNTRY123"...)
  country_id
  ...

考虑到这一点,我通常会执行以下类型的查找:
select * from countries c
inner join banks b
on b.country_id = c.id
where c.short_name = ? and b.name = ?

我应该在哪些列上创建索引?我想在countries中我应该在short_name上创建一个附加索引(id将保留为一个主的自动递增键)。我不知道banks,如果我在name上创建一个索引,这是一个varchar字符串,它是否高效且明智?

最佳答案

如果这是您的问题:

select *
from countries c inner join
     banks b
     on b.country_id = c.id
where c.short_name = ? and b.name = ?;

您有两种索引方法。基本思想是,sql引擎将从一个表中查找行(扫描),然后在另一个表中查找值。
第一种可能是“扫描”countries,然后在banks中查找:
countries(name, id)
banks(country_id, short_name)

第二种可能是“扫描”banks,然后在“国家/地区:
banks(short_name, country_id)
countries(id, name)

实际上,这取决于数据中值的分布。实际上,您可以添加这两个集合并让sql引擎决定。

10-01 16:54