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引擎决定。