나는 모든 국가, 주 및 도시를 포함하는 geonames 데이터베이스 있어요.mysql에 대한 SQL 쿼리 속도 향상 내 mysql 데이터베이스에
사용자가 국가 -> 주 -> 군 -> 도시를 선택할 수 있도록 계단식 메뉴를 만드는 데이 방법을 사용하고 있습니다.
하지만 주요 문제는 어린이 행 목록을 가져올 때마다 해당 테이블의 7 백만 행을 모두 검색하여 10-15 초가 걸리는 것입니다.
나는 이것을 어떻게 할 수 있었는지 궁금하다 : 캐싱? 테이블보기? 어떻게 든 테이블 구조를 재구성?
가장 중요한 것은 어떻게해야합니까? 거기에 나와있는 좋은 자습서가 있습니까?
이 문제를 현명하게 처리하는 방법에 대한 도움과 의견을 보내 주시면 감사하겠습니다.
UPDATE : 여기 내 테이블 구조입니다 :
CREATE TABLE `geonames_copy` (
`geoname_id` mediumint(9) NOT NULL,
`parent_id` mediumint(9) DEFAULT NULL,
`name` varchar(200) DEFAULT NULL,
`ascii_name` varchar(200) DEFAULT NULL,
`alternate_names` varchar(4000) DEFAULT NULL,
`latitude` decimal(10,7) DEFAULT NULL,
`longitude` decimal(10,7) DEFAULT NULL,
`feature_class` char(1) DEFAULT NULL,
`feature_code` varchar(10) DEFAULT NULL,
`country_code` varchar(2) DEFAULT NULL,
`cc2` varchar(60) DEFAULT NULL,
`admin1_code` varchar(20) DEFAULT NULL,
`admin2_code` varchar(80) DEFAULT NULL,
`admin3_code` varchar(20) DEFAULT NULL,
`admin4_code` varchar(20) DEFAULT NULL,
`population` bigint(20) DEFAULT NULL,
`elevation` int(11) DEFAULT NULL,
`gtopo30` smallint(6) DEFAULT NULL,
`time_zone` varchar(40) DEFAULT NULL,
`modification_date` date DEFAULT NULL,
PRIMARY KEY (`geoname_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
가 여기에 SQL 쿼리는 다음과 같습니다 PARENT_ID 및 feature_class :
$query = "SELECT geoname_id, name
FROM geonames
WHERE parent_id = '$geoname_id'
AND (feature_class = 'A')";
난 그냥 2 열에 대한 인덱스를 생성해야합니까?
한 가지 질문 : mysql 대신 solr을 사용하여 색인을 만드는 것이 더 좋지 않습니까? 한 가지 이점은 이미 sol을 사용하고 있으며 다른 장점은 전체 텍스트 검색을 지원한다는 것입니다. 그래서 어쩌면 내가 solr과 mysql (2 가지 좋은 일)을 사용하지 않는 것이 더 낫다.
현재 테이블 구조는 어떻게 생겼습니까?필요할 때 인덱스를 사용하고 있습니까? 적절한 인덱스를 사용하면 이와 같은 쿼리가 거의 즉시 발생합니다. – Wolph
각 항목은 동일한 테이블의 다른 항목을 참조합니다. 그게 내가 케딩 메뉴를 만드는 방법이야. 어떻게 인덱스를 만들 수 있으며 어떻게 작동합니까? 좀 더 많은 정보 (자습서 링크)를 보내 주시겠습니까? 감사합니다 –
인덱스는 확실히 귀하의 질문에 대한 답변입니다 - 귀하의 현재 테이블 구조를 게시하고 우리는 당신이 인덱스를 만들 수 있습니다. –