this wiki article을 읽고 MySQL 데이터베이스의 인덱싱 된 열과 함께 IN() 절을 사용하면 SELECT 성능이 저하된다는 것을 알았습니다. 내 질문은 어떻게 그것의 기능을 유지하면서 어떤 IN() 절을 사용하지 않습니다 내 쿼리를 다시 작성할 수 있습니다?IN() 절을 사용하여 쿼리 최적화
내 쿼리는 다음과 같습니다
SELECT
`Route`.`route_id`, `Route`.`order`, `Route2`.`order`
FROM
`routes` AS `Route`
INNER JOIN
`routes` AS `Route2`
ON `Route`.`route_id` = `Route2`.`route_id`
WHERE
`Route`.`station_line_id` IN ([10 values]) AND
`Route2`.`station_line_id` IN ([10 values]) AND
`Route`.`order` <= `Route2`.`order`
GROUP BY `
`Route`.`station_line_id`, `Route2`.`station_line_id`, (`Route2`.`order` - `Route`.`order`)
내가 (route_id, station_line_id, station_id 및 line_id), ID 열에는 기본 키 인 상태 (테이블 그냥 읽기 전용 한 번 생성 된 모든 열을 색인을, 그래서 모든 것에 대한 색인 작성에 대한 걱정은 없습니다.) IN() 절의 [10 values]
은 쉼표로 구분됩니다 (예 : IN(1, 2, ..., 10)
).
기본적으로 테이블 경로 테이블을 자체 조인하고 결과를 그룹화하여 원하는 레코드를 얻습니다. 다른 조인은 연관된 데이터를 검색하는 데 사용됩니다.
InnoDB 스토리지 엔진을 사용하여 성능 측면에서 30 초 이상 비슷한 쿼리를 실행합니다. MyISAM을 사용하면 5 초를 넘습니다. 그러나 나는 결과가 더 빨리 추출 될 수 있다고 믿습니다. 테이블에 450 만 개의 레코드가 있습니다.
검색어를 조금 포맷하는 데주의해야합니까? –
내 질문을 수정했습니다. 죄송합니다. – linkyndy
IN (1,3,47, ... 89) 또는 'IN (SELECT column FROM table)'과 같은 10 개의 값이 있습니까? –