cities
(거의 3M 행)과 countries
(수백 행)의 두 테이블에서 도시와 국가를 선택하려면 PHP와 jQuery를 사용하여 실시간 검색을 수행해야합니다. 내가 FULLTEXT
검색을 지원하지 않습니다 InnoDB
로 cities
에 대한 MyISAM
테이블을 사용하여 생각하고 있었는데 짧은 순간을 위해 인덱스를 사용하지 않는 MySQL 인덱스
InnoDB
입니다 +
InnoDB
도
FULLTEXT
색인을 지원하기 시작합니다.
그래서 지금도 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.id
에 PRIMARY
및 ci.city_real
에 INDEX
가 입력 된 경우 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