我有两个数据库表:
城市列:
Country_Code | City_Code | City_Name
与列国
Country_Code | Country_Name
基于用户输入的几个字符,它会检查City_Name
列返回结果来填充City
自动完成框。结果需要有城市代码,城市名称,国家代码,以及国家名称,因此需要一个连接。
我使用的查询
SELECT TOP 10
ci.Country_Code, ci.City_Code, ci.City_Name, co.Country_Name
FROM
Cities ci
LEFT OUTER JOIN
Countries co ON ci.Country_Code = co.Country_Code
WHERE
ci.City_Name LIKE '@CityName'
ORDER BY
ci.City_Name
我得到的结果是正确的,但查询需要很长的时间才能完成。从我的理解,首先,结果中包含联接两个表,那么where子句踢只得到特定的行,这是由城市名称排序,前10个结果返回。
我的问题是,有没有办法来加快查询。有where子句检查,然后只执行连接,更好的是只对前10个结果进行呢?我试图把我的WHERE
子句ON
子句中,但是这给了错误的结果。
编辑:@CityName包含用户,然后一个“%”进入2-3个字符。
我建议开始与添加上Countries.Country_Code
聚集索引(也使其成为国家表的主键,如果它是不是已经如此)。索引排序会使得加入搜索速度提高了表。
这似乎是你的查询:
SELECT TOP 10 ci.Country_Code, ci.City_Code, ci.City_Name, co.Country_Name
FROM Cities ci LEFT OUTER JOIN
Countries co
ON ci.Country_Code = co.Country_Code
WHERE ci.City_Name LIKE @CityName
ORDER BY ci.City_Name ;
行情不应该需要周围@CityName
。
我不明白的LEFT JOIN
。这表明,有没有有效的Country_Code
城市 - 这似乎不太可能。
假设@CityName
不以通配符开始(由你的问题的建议),那么这可以使用索引。我建议以下指标:
cities(city_name, country_code)
countries(country_code, country_name)
不需要第二如果country_code
是主键。