SQL 코드에서 "ORDER BY"구문을 사용하여 성능 문제가 발생했습니다.ORDER BY를 사용할 때 MySQL이 인덱스를 사용하지 않습니다 ("filesort 사용").
SQL에서 ORDER BY 문을 사용하지 않는 한 모든 것이 좋습니다. 그러나 일단 ORDER BY : SQL 코드를 도입하면 올바른 인덱싱의 부재로 인해 모든 것이 느려집니다. 하나는이 문제를 해결하는 것이 사소한 것이라고 생각하지만, 포럼 토론 등으로 판단하는 것은이 질문에 대한 명확하고 간결한 대답을 아직 보지 못한 다소 일반적인 문제인 것으로 보입니다. 내가 값을 정렬하는 동안 값 1 - 범위의 테이블을 쿼리 할 때 사용할 인덱스를 만들려면 어떻게해야 주어진 다음의 표 ...
CREATE TABLE values_table ( id int(11) NOT NULL auto_increment, ... value1 int(10) unsigned NOT NULL default '0', value2 int(11) NOT NULL default '0', PRIMARY KEY (id), KEY value1 (value1), KEY value2 (value2), ) ENGINE=MyISAM AUTO_INCREMENT=2364641 DEFAULT CHARSET=utf8;
... :
질문 값 2?
현재 ORDER BY 절을 사용하지 않으면 가져 오기가 정상입니다.
는 EXPLAIN 다음 쿼리 출력을 참조하십시오
OK, when NOT using ORDER BY: EXPLAIN select ... from values_table this_ where this_.value1 between 12345678 and 12349999 limit 10; +----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+ | 1 | SIMPLE | this_ | range | value1 | value1 | 4 | NULL | 3303 | Using where | +----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
However, when using ORDER BY I get "Using filesort": EXPLAIN select ... from values_table this_ where this_.value1 between 12345678 and 12349999 order by this_.value2 asc limit 10; +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------------+ | 1 | SIMPLE | this_ | range | value1 | value1 | 4 | NULL | 3303 | Using where; Using filesort | +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------------+
테이블 내용에 대한 몇 가지 추가 정보 :
SELECT MIN(value1), MAX(value1) FROM values_table; +---------------+---------------+ | MIN(value1) | MAX(value2) | +---------------+---------------+ | 0 | 4294967295 | +---------------+---------------+ ... SELECT MIN(value2), MAX(value2) FROM values_table; +---------------+---------------+ | MIN(value2) | MAX(value2) | +---------------+---------------+ | 1 | 953359 | +---------------+---------------+
어떤 추가 정보가 질문에 대답 할 필요가 있으면 알려 주시기 바랍니다 .
미리 감사드립니다.
업데이트 # 1 : 새로운 복합 인덱스를 추가 (ALTER 테이블 INDEX (값 1, 값을 ADD values_table)는) 문제가 해결되지 않습니다. 이러한 인덱스를 추가 한 후에도 "Using filesort"가 표시됩니다.
업데이트 # 2 : 제약 조건 내 질문에 언급하지 않았다 차라리 사용하는 SQL 쿼리를 변경하는 대신 (말 등, 인덱스를 추가) 테이블의 구조를 변경 것이다. SQL 질의는 Hibernate를 사용하여 자동으로 생성되기 때문에, 그것들을 다소 고칠 수도있다.
귀하의 업데이트에서 value1, value2를 의미한다고 가정합니다. 그렇습니까? – paxdiablo
@ Quassnoi가 value1 범위에 대해 설명했기 때문에 어쨌든 작동하지 않습니다. 그것은 가치 1의 단일 가치를 위해 일했을 것입니다. 그러나 나는 그 질문을 충분히 읽지 않았습니다. 행운을 빌어 요. – paxdiablo
쿼리에서 필드를 직접 사용하거나 함수를 사용하고 있습니까? 타임 스탬프 필드 및 WEEK (타임 스탬프)와 같습니다. –