2012-07-05 3 views
1

mysql에 약 1 백만 개의 레코드가있는 큰 테이블이 있습니다.mysql 제한 성능

나는 절과 순서, 그래서 난 AND id > 34000 LIMIT 10

내가 WHERELIMITORDER 내 필드에 인덱스가 있지만 인덱스가 도움이되지 않습니다 같은 일부 코드를 사용하지 못할 경우에 다른 매개 변수를 동적 쿼리를 사용하고 있습니다 혼자.

LIMIT 34000, 10보다 나은 방법이 필요합니다. 오프셋 지연을 slove 할 수있는 방법이 있습니까?

동적 테이블을 사용하고 있기 때문에 테이블 스키마를 추가했지만 인덱스가없는 유용한 필드를 복사합니다.

CREATE TABLE IF NOT EXISTS `p_apartmentbuy` (
    `property_id` mediumint(8) unsigned NOT NULL, 
    `dateadd` int(10) unsigned NOT NULL, 
    `sqm` smallint(5) unsigned NOT NULL, 
    `sqmland` smallint(5) unsigned NOT NULL, 
    `age` tinyint(2) unsigned NOT NULL, 
    `price` bigint(12) unsigned NOT NULL, 
    `pricemeter` int(11) unsigned NOT NULL, 
    `floortotal` tinyint(3) unsigned NOT NULL, 
    `floorno` tinyint(3) unsigned NOT NULL, 
    `unittotal` smallint(4) unsigned NOT NULL, 
    `unitthisfloor` tinyint(3) unsigned NOT NULL, 
    `room` tinyint(1) unsigned NOT NULL, 
    `parking` tinyint(1) unsigned NOT NULL, 
    `renovate` tinyint(1) unsigned NOT NULL, 
    `address` varchar(255) COLLATE utf8_general_ci NOT NULL, 
    `describe` varchar(500) COLLATE utf8_general_ci NOT NULL, 
    `featured` tinyint(1) unsigned NOT NULL, 
    `l_location_id` smallint(5) unsigned NOT NULL, 
    `l_city_id` smallint(4) unsigned NOT NULL, 
    `pf_furnished_id` tinyint(2) unsigned NOT NULL, 
    PRIMARY KEY (`property_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; 
+0

쿼리가 WHERE 및 ORDER BY에 대해 인덱스를 사용할 수 있으면 LIMIT가 빠를 수 있습니다. 쿼리를 게시 할 수 있습니까, 스키마 ('SHOW CREATE TABLE

') 및'EXPLAIN '출력? – arnaud576875

+0

필드에 인덱스를 사용하는 것은'WHERE LIMIT ORDER' 절에 있지만 혼자만은 도움이되지 않습니다. 동적 테이블 스키마가 커야 내 쿼리를 게시 할 수 없습니다 : -s @ arnaud576875 – Hamidreza

+0

쿼리의 한 가지 변형 만 게시하고 스키마에서 관련이없는 열을 제거하십시오.) (단지 WHERE 및 ORDER BY 절에 사용 된 열과 더하기 인덱스를 참조해야 함) – arnaud576875

답변

2

문제를 참조 AND id > 34000 LIMIT 10 또는 LIMIT 34000, 10 그 것까지 구조 쿼리의 나머지. I.E, 질의 속도를 높이기 위해 색인, PK, FK가 필요합니다. 질서가 느려질 것입니다. like '%text%' 질의가 느려질 것입니다. 또한 테이블의 엔진까지입니다.

변화하는 한계 10이 큰 차이를 만들 것이라고 기대하지 마십시오. '더 나은'쿼리를 결정하는 데 도움이되는 몇 가지 도구가 있지만 모든 쿼리가 동일하게 작동하지 않으므로 존재하지 않기 때문에 "최상의 솔루션"을 기대하지 마십시오.

당신은 당신이 그것을

EDIT 개선하기 위해 적용하는 함수의 대략적인 시간보고 무슨 일이 일어나고 있는지 확인하거나 명령을 benchmark을 사용하여 표시 create table 또는 Describe select ...... 또는 explain를 사용할 수 있습니다

일부를 MySQL 용 도구 이 부분에 도움이 될이 프로그램을 살펴 보도록 권합니다.

  • Mysqlslap (벤치 마크와 비슷하지만 더 많은 결과를 사용자 정의 할 수 있음).
  • SysBench (CPU 성능, I/O 성능, 뮤텍스 경합, 메모리 속도, 데이터베이스 성능).
  • Mysqltuner (이것으로 일반 통계, 스토리지 엔진 통계, 성능 메트릭을 분석 할 수 있습니다).
  • mk-query-profiler (SQL 문 분석 수행).
  • mysqldumpslow (마녀 쿼리가 문제를 일으키는 것을 알면 좋습니다).
+0

'% like text'와 같은 성능이 낮은 쿼리를 사용하지 않았습니다. '하지만 일부 쿼리에서는'match against'을 사용해야합니다. 내 가장 큰 문제는 몇 가지 필드에 의해 주문 및 오프셋 지연 때 내가 200000th 레코드가 필요합니다. – Hamidreza

+0

@ hamidreza66 나는 당신이 좋아하는 것을 사용하지 않는다는 것을 알고 있지만, 쿼리를 만드는 다른 방법이 있기 때문에 "최선의 방법"을 가질 수 없다는 것을 의미합니다. 응답 시간은 다양합니다. 가장 중요한 것은 DATABASE의 구조와 '좋은'성능을 얻기위한 완전한 쿼리입니다. 나는 당신에게 더 나은 해결책을 찾는 데 도움이 될 몇 가지 도구를 알려줍니다. – jcho360

+0

이 도구에 대해 알고 싶습니다 – Hamidreza

1

MySQL은 LIMIT 절을 최적화 할 수 있습니다 (즉, 단지/스캔 LIMIT에 의해 지정된 범위의 행을 평가)는 쿼리와 일치하는 행을 찾을에만 인덱스를 사용할 수있는 경우.

SELECT * FROM users WHERE active = 1 ORDER BY created_at과 같은 검색어의 경우 (active, created_at)를 추가하고 색인하면 충분합니다.

는 습관 1 개 밀 기록이있는 테이블로 http://www.mysqlperformanceblog.com/2006/09/01/order-by-limit-performance-optimization/

+0

알지만 쿼리가 동적이고 1 개의 필드가있을 경우 어떻게해야합니까? in where 절 또는 20 field! – Hamidreza

+0

이 쿼리는 검색 폼 용이며 모든 레코드를 반환 할 수 있으며 ID 또는 고유 ID별로 정렬되지 않습니다. 제한 오프셋을 사용하는 나쁜 방법이라고 생각합니다. – Hamidreza