2012-02-13 3 views
2

나는 약 6-7lacs 레코드가있는 테이블을 가지고 있으며 시간이지나면서 커질 것입니다.이 테이블에는 약 16-20 열이 있습니다. 이러한 열에는 일대일 관계가 없습니다.SQL 테이블 분할 - 필요합니까?

사용자 데이터 항목은이 테이블에 저장됩니다.

내 테이블을 여러 개의 작은 테이블로 나눌 수도 있습니다. 그렇지 않으면 테이블을 2 개의 절반으로 분할하고 그 중 모든 항목과 피드를 데이터 입력 연산자에 제공하는 최근의 새로운 레코드로 분할하십시오 그들의 입장에서.

짧은 내 질문에 만약 내가 테이블을 분할하면 mysql 실행 시간이 더 빨라지는지, 아니면 두 개의 절반으로 나누면 더 빠를 것인가이다.

어떤 결합 쿼리도 수행하지 않으므로 후자가 더 적합 할 것입니다. 같은 structure.Is와 images_history이 가능

CREATE TABLE `images` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `primary_category_id` int(10) unsigned DEFAULT NULL, 
    `secondary_category_id` int(10) unsigned DEFAULT NULL, 
    `front_url` varchar(255) DEFAULT NULL, 
    `back_url` varchar(255) DEFAULT NULL, 
    `title` varchar(100) DEFAULT NULL, 
    `part` varchar(10) DEFAULT NULL, 
    `photo_id` int(10) unsigned DEFAULT NULL, 
    `photo_dt_month` varchar(2) DEFAULT NULL, 
    `photo_dt_day` varchar(2) DEFAULT NULL, 
    `photo_dt_yr` varchar(4) DEFAULT NULL, 
    `type` varchar(25) DEFAULT NULL, 
    `size_width` int(10) unsigned DEFAULT NULL, 
    `size_height` int(10) unsigned DEFAULT NULL, 
    `dpi` int(10) unsigned NOT NULL DEFAULT '0', 
    `dpix` int(10) unsigned DEFAULT NULL, 
    `dpiy` int(10) unsigned DEFAULT NULL, 
    `in_stock` varchar(50) DEFAULT NULL, 
    `outlet` varchar(50) DEFAULT NULL, 
    `source` varchar(50) DEFAULT NULL, 
    `keywords` varchar(255) DEFAULT NULL, 
    `emotional_keywords` varchar(255) DEFAULT NULL, 
    `mechanical_keywords` varchar(255) DEFAULT NULL, 
    `description` text, 
    `notes` text, 
    `comments` text, 
    `exported_to_ebay_dt` datetime DEFAULT NULL, 
    `exported_to_ebay` set('Y','N') NOT NULL DEFAULT 'N', 
    `updated_worker_id` int(10) unsigned DEFAULT NULL, 
    `updated_worker_dt` datetime DEFAULT NULL, 
    `locked_worker_id` int(10) unsigned DEFAULT NULL, 
    `locked_worker_dt` datetime DEFAULT NULL, 
    `updated_admin_id` int(10) unsigned DEFAULT NULL, 
    `updated_admin_dt` datetime DEFAULT NULL, 
    `added_dt` datetime DEFAULT NULL, 
    `updated_manager_id` int(10) unsigned DEFAULT NULL, 
    `updated_manager_dt` datetime DEFAULT NULL, 
    `manager_review` set('Y','N') NOT NULL DEFAULT 'N', 
    `paid_status` set('Y','N') NOT NULL DEFAULT 'N', 
    `exported_to_web_dt` datetime DEFAULT NULL, 
    `exported_to_web` set('Y','N') DEFAULT 'N', 
    `prefix` varchar(50) DEFAULT NULL, 
    `is_premium` set('Y','N') DEFAULT 'N', 
    `template` varchar(50) DEFAULT 'HIPE_default', 
    `photographer` varchar(100) DEFAULT NULL, 
    `copyright` varchar(100) DEFAULT NULL, 
    `priority` int(4) DEFAULT '1', 
    `step` set('1','2') DEFAULT '1', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `part` (`part`), 
    KEY `primary_category_id` (`primary_category_id`), 
    KEY `updated_worker_id` (`updated_worker_id`), 
    KEY `updated_worker_dt` (`updated_worker_dt`) 
) ENGINE=MyISAM AUTO_INCREMENT=1013687 DEFAULT CHARSET=latin1 

이 만들어지는 항목이 내가 다른 테이블로 분할 할 1lac 주위에 말을 말하는 위 내 테이블 structure.After 또는 내가 그들을 분할해야합니다

업데이트 여러 테이블에 쿼리 실행 시간을 줄이기 위해

+0

는 일부 DDL은 설명 추가 할 수 대략 테이블이 어떻게 생겼는지, 분할 된 경우 어떻게 보일까요? –

+0

편집 해 주셔서 감사합니다 ... didn ' 왜 형식화되지 않았는지 모르겠다. –

+0

'6-7lks'이란 무엇입니까 ?? – DisgruntledGoat

답변

1

왜 테이블을 분할 하시겠습니까? 새로운 테이블에 모두 액세스하려는 경우 여분의 코드가 추가되고 실행 시간이 느려집니다. (테이블 중 하나에서 이미지 테이블의 이전 버전 레코드 (예 : 버전 관리)가 거의 사용되지 않는 경우 여전히 좋은 아이디어 일 수 있습니다. 모두 선택이 PRIMARY KEY로 필터링 수행

  • : 심지어 테이블을 분할에 대해 생각하기 전에 다음과 같은 성능 재해 있는지 아무도을하지하여 기존 코드를 최적화하여 성능을 향상시킬 수있는 경우

    ,?을 참조하십시오

  • 인덱스 캐시가 컴퓨터 RAM의 모든 인덱스를 저장할만큼 충분히 큰가요?
  • 인덱스를 사용하여 SELECT와 LIKE를 일치시키는 문자열이 있습니까? 나는. 정확히 일치하는 항목이나 오른쪽의 와일드 카드는 왼쪽에 절대 표시되지 않습니다 (예 : "searchword %"및 결코 "% searchword")
  • 필요한 열만 선택하는 대신 SELECT *를 사용하는 쿼리가 느려 집니까
  • 사용 또는 SELECT들에서 피할? tabels입니다이 제대로 인덱싱 및 쿼리가 실제로 그 인덱스를 사용하는 경우 700 개 000 레코드 테이블에 쿼리를 수행

느린해서는 안됩니다.

+0

색인을 생성하면 성능이 향상되지만, 약 15-20 열의 표가 나뉘면 어떻게 될까요? 각각 5 ~ 6 개의 컬럼을 가지며 좋은 인덱싱을 가진 3-4 개의 테이블로 이렇게하면 SQL 실행 시간이 단축됩니까? 그건 내 진짜 질문 –

+0

BLOB 종류 (TEXT, LONGTEXT)의 열이있는 경우 SELECT * 또는 SELECT blobcolumn은 데이터가 RAM 대신 디스크의 TMP 테이블에 기록되도록합니다.컬럼을 많이 사용하면 실제로 인덱싱 된 컬럼을 사용하여 사용하려는 컬럼에 실제로 액세스 할 경우 AFAIK가 아무 것도 느려지지 않습니다. –

+0

@ Harald : 감사합니다! 나는 많은 텍스트 열만 2-3 (위의 구조를 확인하십시오.) 그래서 쿼리 실행 시간이 늘어날 것입니다. Select *와 같은 쿼리를 실행 한 경우 몇 개의 열에 대해서만 인덱스 만 있습니다. 테이블을 분할하고 있습니다. 그때 필요성? –