2011-01-06 9 views
0

저는 MySQL 전문가가 아니며 문제가 있습니다. 나는 현재 16GB의 데이터를 저장하고 더 성장할 수있는 테이블을 가지고있다.MySql 성능 제안

인텔 제온, 내 서버 구성 아래에 주어진 테이블의 구조는

CREATE TABLE `t_xyz_tracking` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT, 
`word` VARCHAR(200) NOT NULL, 
`xyzId` BIGINT(100) NOT NULL, 
`xyzText` VARCHAR(800) NULL DEFAULT NULL, 
`language` VARCHAR(2000) NULL DEFAULT NULL, 
`links` VARCHAR(2000) NULL DEFAULT NULL, 
`xyzType` VARCHAR(20) NULL DEFAULT NULL, 
`source` VARCHAR(1500) NULL DEFAULT NULL, 
`sourceStripped` TEXT NULL, 
`isTruncated` VARCHAR(40) NULL DEFAULT NULL, 
`inReplyToStatusId` BIGINT(30) NULL DEFAULT NULL, 
`inReplyToUserId` INT(11) NULL DEFAULT NULL, 
`rtUsrProfilePicUrl` TEXT NULL, 
`isFavorited` VARCHAR(40) NULL DEFAULT NULL, 
`inReplyToScreenName` VARCHAR(40) NULL DEFAULT NULL, 
`latitude` BIGINT(100) NOT NULL, 
`longitude` BIGINT(100) NOT NULL, 
`rexyzStatus` VARCHAR(40) NULL DEFAULT NULL, 
`statusInReplyToStatusId` BIGINT(100) NOT NULL, 
`statusInReplyToUserId` BIGINT(100) NOT NULL, 
`statusFavorited` VARCHAR(40) NULL DEFAULT NULL, 
`statusInReplyToScreenName` TEXT NULL, 
`screenName` TEXT NULL, 
`profilePicUrl` TEXT NULL, 
`xyzId` BIGINT(100) NOT NULL, 
`name` TEXT NULL, 
`location` VARCHAR(200) NULL DEFAULT NULL, 
`bio` TEXT NULL, 
`url` TEXT NULL COLLATE 'latin1_swedish_ci', 
`utcOffset` INT(11) NULL DEFAULT NULL, 
`timeZone` VARCHAR(100) NULL DEFAULT NULL, 
`frenCnt` BIGINT(20) NULL DEFAULT '0', 
`createdAt` DATETIME NULL DEFAULT NULL, 
`createdOnGMT` VARCHAR(40) NULL DEFAULT NULL, 
`createdOnServerTime` DATETIME NULL DEFAULT NULL, 
`follCnt` BIGINT(20) NULL DEFAULT '0', 
`favCnt` BIGINT(20) NULL DEFAULT '0', 
`totStatusCnt` BIGINT(20) NULL DEFAULT NULL, 
`usrCrtDate` VARCHAR(200) NULL DEFAULT NULL, 
`humanSentiment` VARCHAR(30) NULL DEFAULT NULL, 
`replied` BIT(1) NULL DEFAULT NULL, 
`replyMsg` TEXT NULL, 
`classified` INT(32) NULL DEFAULT NULL, 
`createdOnGMTDate` DATETIME NULL DEFAULT NULL, 
PRIMARY KEY (`id`), 
INDEX `id` (`id`, `word`), 
INDEX `word_index` (`word`) USING BTREE, 
INDEX `classified_index` (`classified`) USING BTREE, 
INDEX `createdOnGMT_index` (`createdOnGMT`) USING BTREE, 
INDEX `location_index` (`location`) USING BTREE, 
INDEX `word_createdOnGMT` (`word`, `createdOnGMT`), 
INDEX `timeZone` (`timeZone`) USING BTREE, 
INDEX `language` (`language`(255)) USING BTREE, 
INDEX `source` (`source`(255)) USING BTREE, 
INDEX `xyzId` (`xyzId`) USING BTREE, 
INDEX `getunclassified_index` (`classified`, `xyzType`) USING BTREE, 
INDEX `createdOnGMTDate_index` (`createdOnGMTDate`, `word`) USING BTREE, 
INDEX `links` (`links`(255)) USING BTREE, 
INDEX `xyzType_classified` (`classified`, `xyzType`) USING BTREE, 
INDEX `word_createdOnGMTDate` (`word`, `createdOnGMTDate`) USING BTREE 
    )COLLATE='utf8_general_ci' 
    ENGINE=InnoDB 
    ROW_FORMAT=DEFAULT 
    AUTO_INCREMENT=17540328 

이 테이블에 쿼리

지금 천천히 실행하고, 아래되고 나는 그들이 더 둔화 할 것으로 예상하고있다 E5220의 @의 2.27GHz (2 개 프로세서) 12기가바이트 램 윈도우 2008 서버 R2

의 my.ini 파일 세부 사항은 아래와 같습니다

,

  1. 은 MyISAM 테이블 도움말을 변환겠습니까성능을 개선하기 위해 무엇을 할 수 있는지

    default-storage-engine=INNODB 
    sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 
    max_connections=300 
    query_cache_size=0 
    table_cache=256 
    tmp_table_size=205M 
    thread_cache_size=8 
    myisam_max_sort_file_size=3G 
    myisam_sort_buffer_size=410M 
    key_buffer_size=354M 
    read_buffer_size=64K 
    read_rnd_buffer_size=256K 
    sort_buffer_size = 64M 
    join_buffer_size = 64M 
    thread_cache_size = 8 
    thread_concurrency = 8 
    query_cache_size = 128M 
    innodb_additional_mem_pool_size=15M 
    innodb_flush_log_at_trx_commit=1 
    innodb_log_buffer_size=30M 
    innodb_buffer_pool_size=6G 
    innodb_log_file_size=343M 
    innodb_thread_concurrency=44 
    max_allowed_packet = 16M 
    slow_query_log 
    long_query_time = 6 
    
    ,이 테이블은 자주 쓰기가 더욱 자주 읽고 있기 때문에, 나는 INNODB 있습니다.
  2. 나는 당신이있어 같은 I/O를 20-40메가바이트/초만큼 높은 시간에

덕분에, Rohit

+0

느린 쿼리에 대한 정보가 필요합니다. 이 테이블에 인덱스가 있습니까? –

+0

또한 이러한 쿼리의 EXPLAIN 출력도 유용 할 수 있습니다. – hometoast

+0

여기에서 시작하십시오 - >>> http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html. –

답변

5

한 가지 제안이 테이블의 데이터를 기반으로,

SELECT * FROM t_xyz_tracking PROCEDURE ANALYSE() 

PROCEDURE ANALYSE 당신을 말할 것이다 실행하는 것입니다, 테이블의 컬럼에 대한 제안 된 유형. 이렇게하면 효율성이 높아집니다.

+0

나는 이것에 대해 몰랐다. 멋지다. – hometoast

+0

예.저는 여러분이이 BIGINT의 대부분을 INT 나 MAE를 선호하여 제거 할 수 있다고 확신합니다. – Mchl

0

그냥 내 머리 위로 떨어져, 보이는 높은 디스크를 발견했습니다 당신이하지 말아야 할 곳에 TEXT 유형을 사용하십시오. TEXT는 CLOB입니다 (문자 만 BLOB로 생각하십시오). URL이 있으면 VARCHAR (255)가 더 잘 작동 할 수 있습니다. 이름은 50 자 정도면 충분하지 않습니까?

느리게 실행되는 쿼리는 인덱스를 활용하고 있습니까?

"isXXX"필드가 BOOLEAN (또는 tinyint (1))으로 변경 될 수 있습니까?

1

모든 NULL 가능 열을 잠재적으로 별도의 테이블로 이동할 수 있습니다. 이 열의 각 값의 백분율이 NULL인지 확인하고 상대적으로 높으면 별도의 테이블로 이동하십시오.

다음으로 자주 액세스하는 열과 비교적 드물게 액세스하는 열을 생각할 수 있습니다. 드물게 사용되는 열은 별도의 테이블로 이동할 수도 있습니다.

1

mysql 서버가 너무 느리면 "느린 쿼리 로그"를 활성화 한 다음 나타나는 쿼리를 연구하는 것이 좋습니다.

이것은 아마추어적인 서면 쿼리로 인해 발생할 수있는 치명적인 오류를 피할 수있었습니다.