2012-04-29 5 views
2

cities (거의 3M 행)과 countries (수백 행)의 두 테이블에서 도시와 국가를 선택하려면 PHP와 jQuery를 사용하여 실시간 검색을 수행해야합니다. 내가 FULLTEXT 검색을 지원하지 않습니다 InnoDBcities에 대한 MyISAM 테이블을 사용하여 생각하고 있었는데 짧은 순간을 위해 인덱스를 사용하지 않는 MySQL 인덱스

은, 그러나 그것은 (자주 테이블 충돌을 갈 수있는 방법이 아니다 결정, 다른 모든 테이블 등와 MySQL 5.6 InnoDB입니다 + InnoDBFULLTEXT 색인을 지원하기 시작합니다.

그래서 지금도 MySQL 5.1을 사용하고 있으며 대부분의 도시는 한 단어 만 또는 최대 2-3 단어로 구성되어 있습니다. "뉴욕"- "뉴욕"을 의미하는 경우 대부분의 사람들은 "요크"를 검색하지 않습니다. 따라서 색인을 city_real 열 (varchar)에 넣었습니다.

다음 쿼리 (와일드 카드 인 경우 내가 USE INDEX으로, 어떤 JOIN없이 ORDER BY하지 않고, 다른 버전을 시도하고도 FORCE INDEX로, 나는 = (대신 동일한 LIKE 시도)하지만 또 다른 게시물 말했다 = 빠른이었고, 끝 부분에서만, 그것을 사용하는 것이 좋습니다), EXPLAIN에서 항상 "using filesort"를 사용합니다. 쿼리의 평균 시간은 약 4 초입니다. 라이브 검색 (텍스트 상자에 입력하고 도시 및 국가의 제안을 보는 사용자)에 대해 약간 느려질 수 있음을 인정해야합니다 ...

실시간 검색 사용자가 최소 3 자 ...

SELECT ci.id, ci.city_real, co.country_name FROM cities ci LEFT JOIN countries co ON(ci.country_id=co.country_id) WHERE city_real='cit%' ORDER BY population DESC LIMIT 5 

ci.idPRIMARYci.city_realINDEX가 입력 된 경우 jQuery를 아약스)을 검색합니다. MySQL이 인덱스를 사용하지 않는 이유는 무엇입니까? 아니면 쿼리 속도를 높일 수 있습니까? 또는 다른 곳에서 INDEX을 설정하지 않아야합니까?

도움을 주셔서 감사합니다.


는 여기에 당신은 WHERE city_real LIKE 'cit%'하지 WHERE city_real='cit%' 사용해야 출력을

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE ci range city_real city_real 768 NULL 1250 Using where; Using filesort 
1 SIMPLE co eq_ref PRIMARY PRIMARY 6 fibsi_1.ci.country_id 1  

답변

3

을 설명합니다.

내가 대신 동일한 LIKE 시도 (=)하지만 또 다른 포스트 = 말했다 빠른이고 와일드 카드는 마지막에있는 경우, 그것을

이 잘못 사용 OK입니다. =은 와일드 카드를 지원하지 않으므로 잘못된 결과가 나옵니다.

또는 어떻게 쿼리 속도를 높일 수 있습니까?

색인이 두 테이블 모두에 country_id인지 확인하십시오. 추가 도움이 필요하면 EXPLAIN SELECT ...의 출력을 게시하십시오.

1

설명 출력의 key 필드에 표시된대로 조회가 색인을 사용합니다. filesort를 사용하는 이유는 order by이며, 사용하는 이유는 아마도 필드 중 하나 (city_real, population)가 null 값을 허용합니다.

관련 문제