2017-09-08 1 views
0

posts 테이블 인을 분할하는 것을 시도하고있는 동안 :오류 나는 테이블 여기

내가 쿼리 성능을 개선하기 위해 두 개의 파티션을 만들고 싶어
CREATE TABLE `posts` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, 
`img` varchar(255) COLLATE utf8_croatian_ci NOT NULL, 
`vid` varchar(255) COLLATE utf8_croatian_ci NOT NULL, 
`title` varchar(255) COLLATE utf8_croatian_ci NOT NULL, 
`subtitle` varchar(255) COLLATE utf8_croatian_ci NOT NULL, 
`auth` varchar(54) COLLATE utf8_croatian_ci NOT NULL, 
`story` longtext COLLATE utf8_croatian_ci NOT NULL, 
`tags` varchar(255) COLLATE utf8_croatian_ci NOT NULL, 
`status` varchar(100) COLLATE utf8_croatian_ci NOT NULL, 
`moder` varchar(50) COLLATE utf8_croatian_ci NOT NULL, 
`rec` varchar(50) COLLATE utf8_croatian_ci NOT NULL, 
`pos` varchar(50) COLLATE utf8_croatian_ci NOT NULL, 
`inde` int(11) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=117 DEFAULT CHARSET=utf8 COLLATE=utf8_croatian_ci 

.
첫 번째 파티션은 모두 non-archive 개의 행을 포함해야합니다.
두 번째 파티션 - 모두 archive 행.

ALTER TABLE posts 
PARTITION BY LIST COLUMNS (status) 
(
PARTITION P1 VALUES IN ('admin', 'moder', 'public', 'rec'), 
PARTITION P2 VALUES IN ('archive') 
); 

phpMyAdmin에 오류 :

Static analysis: 

    1 errors were found during analysis. 

    Unrecognized alter operation. (near "" at position 0) 
    MySQL said: 

    #1503 - A PRIMARY KEY must include all columns in the table's partitioning function 

어떤 도움?

+0

오류가이 모든 것을 말합니다. 파티션하려는 열이 기본 키의 일부 여야합니다. – money

+0

PRIMARY KEY (id, status)와 같이 기본 키를 업데이트하십시오. https://stackoverflow.com/questions/11896067/a-primary-must-include-all-columns-in-the-tables-partitioning-location-error – money

답변

1

속도를 높이려는 쿼리가 무엇입니까? 현재 가지고있는 유일한 색인 이후로는 WHERE id=... 또는 WHERE id BETWEEN ... AND ... 만 빠릅니다. 그리고 당신이 제안한 파티션은 다른 쿼리를 위해서에 많은 도움이되지 않을 것입니다.

수십 개의 행만있는 것 같습니다. 적어도 백만 개의 행이있을 것으로 예상하지 않는 한 파티셔닝을 고려하지 마십시오.

status에는 5 개의 값만 있습니까? 그런 다음 ENUM('archive', 'admin', 'moder', 'public', 'rec') NOT NULL으로 만드십시오. 그것은 롯 대신에 1 바이트를 취할 것입니다.

date 및/또는 status 및/또는 auth을 쿼리하는 경우 인덱스, 특히 이러한 인덱스에 대한 '복합'인덱스에 대해 이야기 해 봅시다. 그리고 "아카이브"분할을 달성하려면 인덱스의 첫 번째 열로 status을 입력하십시오.

+0

많은 도움을 주셔서 감사합니다. 매우 유용합니다. 내 테이블은 백만 행을 가지지 않을 것이며, 최대 약 20.000입니다. 파티셔닝 할 이유가 없다고 확신합니까? – puerto

+0

보통 적절한 인덱스는 파티션 분할과 같거나 그보다 좋습니다. 세부 정보 : http://mysql.rjweb.org/doc.php/partitionmaint –