0

私は MySQL の専門家ではなく、問題が発生しています。現在 16 GB のデータを保持するテーブルがあり、さらに大きくなる予定です。テーブルの構造を以下に示します。

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

このテーブルのクエリは現在低速で実行されており、さらに低速になると予想しています。サーバー構成を以下に示します。

Intel Xeon E5220 @2.27GHz (2 プロセッサ) 12GB RAM Windows 2008 Server R2

my.ini ファイルの詳細を以下に示します。

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

パフォーマンスを向上させるために何ができるか、

  1. MyISAM テーブルに変換すると、このテーブルには頻繁に書き込みが行われ、さらに頻繁に読み取りが行われるため、INNODB があります。
  2. ディスク I/O が高く、20 ~ 40MB/秒の高さに気付きました

ありがとう、ロヒット

4

4 に答える 4

5

1つの提案は実行することです

SELECT * FROM t_xyz_tracking PROCEDURE ANALYSE()

PROCEDURE ANALYZEは、テーブル内のデータに基づいて、テーブル内の列の推奨タイプを通知します。これはあなたの効率を上げるのに役立つはずです。

于 2011-01-06T17:19:15.207 に答える
1

すべての NULLable 列は、別のテーブルに移動される可能性があります。これらの各列の値の何パーセントが NULL であるかを確認し、それが比較的高い場合は別のテーブルに移動します。

次に、どの列が頻繁にアクセスされ、どの列が比較的めったにアクセスされないかを考えたいと思うかもしれません。めったに使用されない列も、別のテーブルに移動できます。

于 2011-01-06T17:28:40.687 に答える
1

mysql サーバーが遅すぎる場合は、「スロー クエリ ログ」をアクティブにして、そこに表示されるクエリを調べることをお勧めします。

これは、いくつかのアマチュアな書き込みクエリが原因で発生する可能性のある壊滅的な障害を回避するのに大いに役立ちました.

于 2011-02-09T11:11:25.353 に答える
0

TEXTふと、使ってはいけないタイプを使っているようですね。TEXT は CLOB です (文字のみの BLOB と考えてください)。URL がある場合は、VARCHAR(255) の方が適切に機能する可能性があります。名前って50文字じゃ足りないの?

実行速度が遅いクエリは、インデックスを利用していますか?

「isXXX」フィールドを BOOLEAN (または tinyint(1)) に変更できますか?

于 2011-01-06T17:09:41.190 に答える