1
mysql에 약 1 백만 개의 레코드가있는 큰 테이블이 있습니다.mysql 제한 성능
나는 절과 순서, 그래서 난 AND id > 34000 LIMIT 10
내가 WHERE
및 LIMIT
및 ORDER
내 필드에 인덱스가 있지만 인덱스가 도움이되지 않습니다 같은 일부 코드를 사용하지 못할 경우에 다른 매개 변수를 동적 쿼리를 사용하고 있습니다 혼자.
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;
쿼리가 WHERE 및 ORDER BY에 대해 인덱스를 사용할 수 있으면 LIMIT가 빠를 수 있습니다. 쿼리를 게시 할 수 있습니까, 스키마 ('SHOW CREATE TABLE
필드에 인덱스를 사용하는 것은'WHERE LIMIT ORDER' 절에 있지만 혼자만은 도움이되지 않습니다. 동적 테이블 스키마가 커야 내 쿼리를 게시 할 수 없습니다 : -s @ arnaud576875 – Hamidreza
쿼리의 한 가지 변형 만 게시하고 스키마에서 관련이없는 열을 제거하십시오.) (단지 WHERE 및 ORDER BY 절에 사용 된 열과 더하기 인덱스를 참조해야 함) – arnaud576875
답변
문제를 참조
AND id > 34000 LIMIT 10
또는LIMIT 34000, 10
그 것까지 구조 쿼리의 나머지. I.E, 질의 속도를 높이기 위해 색인, PK, FK가 필요합니다. 질서가 느려질 것입니다.like '%text%'
질의가 느려질 것입니다. 또한 테이블의 엔진까지입니다.변화하는 한계 10이 큰 차이를 만들 것이라고 기대하지 마십시오. '더 나은'쿼리를 결정하는 데 도움이되는 몇 가지 도구가 있지만 모든 쿼리가 동일하게 작동하지 않으므로 존재하지 않기 때문에 "최상의 솔루션"을 기대하지 마십시오.
당신은 당신이 그것을
EDIT 개선하기 위해 적용하는 함수의 대략적인 시간보고 무슨 일이 일어나고 있는지 확인하거나 명령을
benchmark
을 사용하여 표시create table
또는Describe select ......
또는explain
를 사용할 수 있습니다일부를 MySQL 용 도구 이 부분에 도움이 될이 프로그램을 살펴 보도록 권합니다.
출처
2012-07-05 17:01:15 jcho360
'% like text'와 같은 성능이 낮은 쿼리를 사용하지 않았습니다. '하지만 일부 쿼리에서는'match against'을 사용해야합니다. 내 가장 큰 문제는 몇 가지 필드에 의해 주문 및 오프셋 지연 때 내가 200000th 레코드가 필요합니다. – Hamidreza
@ hamidreza66 나는 당신이 좋아하는 것을 사용하지 않는다는 것을 알고 있지만, 쿼리를 만드는 다른 방법이 있기 때문에 "최선의 방법"을 가질 수 없다는 것을 의미합니다. 응답 시간은 다양합니다. 가장 중요한 것은 DATABASE의 구조와 '좋은'성능을 얻기위한 완전한 쿼리입니다. 나는 당신에게 더 나은 해결책을 찾는 데 도움이 될 몇 가지 도구를 알려줍니다. – jcho360
이 도구에 대해 알고 싶습니다 – Hamidreza
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/
출처
2012-07-05 16:58:04 arnaud576875
알지만 쿼리가 동적이고 1 개의 필드가있을 경우 어떻게해야합니까? in where 절 또는 20 field! – Hamidreza
이 쿼리는 검색 폼 용이며 모든 레코드를 반환 할 수 있으며 ID 또는 고유 ID별로 정렬되지 않습니다. 제한 오프셋을 사용하는 나쁜 방법이라고 생각합니다. – Hamidreza
관련 문제