2011-01-06 10 views
0

Ich bin kein MySQL-Experte und stecke in einem Problem fest. Ich habe eine Tabelle, die derzeit 16 GB Daten enthält und weiter wachsen wird. Die Struktur der Tabelle ist unten angegeben,MySql Leistungsvorschläge

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 

Die Abfragen auf dieser Tabelle langsam läuft jetzt und ich erwarte sie weiter zu verlangsamen, meine Server-Konfiguration ist unten angegeben,

Intel Xeon E5220 @ 2.27GHz (2 Prozessoren) 12GB Ram Windows 2008 Server R2

my.ini Details sind unten angegeben,

012.351.
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 

Was die Leistung zu verbessern getan werden kann,

  1. zu MyISAM -Tabelle Hilfe Umwandlung würde, ich habe INNODB da diese Tabelle häufige Schreib hat und noch häufiger liest.
  2. Ich habe hohe Scheibe bemerkt I/O zur Zeit so hoch wie 20-40MB/sec

Danke, Rohit

+0

Wir benötigen Informationen über die Abfragen, die langsam sind. Gibt es Indizes für diese Tabelle? –

+0

auch die Ausgabe von EXPLAIN aus diesen Abfragen könnte auch nützlich sein. – hometoast

+0

starten Sie hier - >>> http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html. –

Antwort

5

Ein Vorschlag

SELECT * FROM t_xyz_tracking PROCEDURE ANALYSE() 

PROCEDURE ANALYSE werden Ihnen sagen, basierend auf den Daten in der Tabelle, die vorgeschlagenen Typen für die Spalten in der Tabelle laufen. Dies sollte helfen, Ihre Effizienz zu steigern.

+0

Ich wusste nichts davon. Das ist nett. – hometoast

+0

Ja.Ich bin mir ziemlich sicher, dass Sie die meisten dieser BIGINTs zugunsten von INTs oder sogar MEDIUMINTs loswerden können. – Mchl

0

Direkt an der Spitze von meinem Kopf, es sieht aus wie du bist Verwenden Sie den TEXT Typ, wo Sie nicht sollten. TEXT ist ein CLOB (denke BLOB nur für Charaktere). Wenn Sie eine URL haben, funktioniert VARCHAR (255) möglicherweise besser. Für einen Namen, ist nicht 50 Zeichen genug?

Die Abfragen, die langsam ausgeführt werden, verwenden sie die Indizes?

Könnten Ihre Felder "isXXX" in BOOLEAN (oder tinyint (1)) geändert werden? ist

1

Alle NULL-fähigen Spalten können möglicherweise in eine separate Tabelle verschoben werden. Prüfen Sie, welcher Prozentsatz der Werte in jeder dieser Spalten NULL ist, und wenn er relativ hoch ist, verschieben Sie ihn in eine separate Tabelle.

Als nächstes möchten Sie vielleicht überlegen, auf welche Spalten sehr oft zugegriffen wird und auf welche nur relativ selten zugegriffen wird. Selten verwendete Spalten können auch in eine separate Tabelle verschoben werden.

1

Wenn Ihr MySQL-Server zu langsam ist, sollten Sie das "langsame Abfrageprotokoll" aktivieren und dann die Abfragen untersuchen, die darin angezeigt werden.

Dies hat mir sehr geholfen, einige katastrophale Fehler aufgrund einiger amateurhaft geschriebener Anfragen zu vermeiden.