Предложения по производительности MySql - PullRequest
0 голосов
/ 06 января 2011

Я не эксперт по MySQL и застрял в проблеме.У меня есть таблица, которая в настоящее время содержит 16 ГБ данных, и она будет расти дальше.Структура таблицы приведена ниже,

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,27 ГГц (2 процессора) 12 ГБ 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. Я заметил высокий дисковый ввод-вывод,на скорости до 20-40 МБ / с

Спасибо, Рохит

Ответы [ 4 ]

5 голосов
/ 06 января 2011

Одним из предложений является запуск

SELECT * FROM t_xyz_tracking PROCEDURE ANALYSE()

АНАЛИЗ ПРОЦЕДУРЫ сообщит вам, основываясь на данных в таблице, предлагаемые типы столбцов в таблице.Это должно помочь повысить вашу эффективность.

1 голос
/ 09 февраля 2011

Когда ваш сервер MySQL слишком медленный, хорошей идеей является активация «журнала медленных запросов», а затем изучение запросов, отображаемых в нем.катастрофические сбои из-за некоторых любительских письменных запросов.

1 голос
/ 06 января 2011

Все столбцы NULLable могут быть потенциально перемещены в отдельную таблицу. Проверьте, какой процент значений в каждом из этих столбцов равен NULL, и, если он относительно высокий, переместите его в отдельную таблицу.

Затем вы можете подумать, к каким столбцам обращаются очень часто, а к каким обращаются относительно редко. Редко используемые столбцы также можно перенести в отдельную таблицу.

0 голосов
/ 06 января 2011

Сверху в голове, похоже, вы используете тип TEXT там, где не должны.TEXT - это CLOB (думаю, BLOB только для символов).Если у вас есть URL, VARCHAR (255) может работать лучше.Для имени не достаточно 50 символов?

Запросы, которые выполняются медленно, используют ли они индексы?

Могут ли ваши поля "isXXX" быть изменены на BOOLEAN (или tinyint (1))

...