有没有办法获取在给定时间段内对整个数据库(MySql)进行的读/写量,例如最后一小时的读/写量?
Ran's questions
我有下表:
CREATE TABLE `timeline_lists` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`list_type` int(11) NOT NULL,
`s_object_id` int(11) NOT NULL DEFAULT '0',
`group_id` int(11) DEFAULT '0',
`new_items_count` int(11) DEFAULT NULL,
`last_accessed_on` datetime DEFAULT NULL,
`last_updated_on` datetime DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`,`user_id`),
KEY `unique_index` (`user_id`,`list_type`,`s_object_id`,`group_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
每次我运行以下查询时,都会添加一条新记录:
INSERT INTO `timeline_lists` (`id`,`user_id`,`list_type`,`s_object_id`,`group_id`,`new_items_count`,`last_accessed_on`,`last_updated_on`,`created_at`,`updated_at`)
VALUES
(NULL,18724,11,0,0,5,'2014-09-23 16:37:46',NULL,'2014-09-23 16:37:48','2014-09-23 16:37:48')
ON DUPLICATE KEY UPDATE
`timeline_lists`.`new_items_count`=VALUES(`new_items_count`),
`timeline_lists`.`last_accessed_on`=VALUES(`last_accessed_on`),
`timeline_lists`.`updated_at`=VALUES(`updated_at`)
我希望唯一索引效果和字段只会得到更新,如果我调整此查询 5 次,我将在数据库中获得 5 条记录,而不仅仅是 1 条。
我在这里想念什么?
请看下面的Mysql表: http: //pastebin.com/b0NDSbdz
我对表进行了分区,sent_at
并确保大多数查询都通过了sent_at
。我需要包含sent_at
在所有索引中吗?
你发现任何潜在的冗余索引了吗?
当我sent_at
在索引中包含时,它是否必须是索引声明中的第一个字段?
我有一个名为 MySql 的表twitter_statuses
,正如标题所暗示的那样,它包含 Twitter 状态。 这是表结构。
该表包含文本列中的各种字符,某些列包含多行的 Ruby 对象。
我试图选择一些记录到一个文件中,然后将它们加载到一个新表中,但是由于所有特殊字符,一些行变得“混乱”。
这是我用来转储状态的查询
这是我用来重新加载转储状态的查询
如您所见,我尝试用 替换文本列中的逗号****
以防止它们拆分字段,并替换多行列中的新行 ( urls
, hashtags
, user_mentions
) 以防止在将文件转储为 CSV 时“截断行”。
目前,多行字段负载很大(换行字符有效)我的问题 ID 与其他字段中出现的其他字符(各种字符)导致拆分列。
关于我可以在那里改变什么的任何想法?
我有下表:
CREATE TABLE `twitter_relationships` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`source_twitter_id` bigint(20) NOT NULL,
`target_twitter_id` bigint(20) NOT NULL,
`relationship_status` tinyint(1) NOT NULL,
`status_change_date` int(11) unsigned DEFAULT NULL,
PRIMARY KEY (`id`,`user_id`),
UNIQUE KEY `source_and_target` (`user_id`,`source_twitter_id`,`target_twitter_id`),
KEY `target_status_and_change_date_index` (`user_id`,`target_twitter_id`,`relationship_status`,`status_change_date`),
KEY `user_id_index` (`user_id`,`status_change_date`)
) ENGINE=InnoDB AUTO_INCREMENT=116597775 DEFAULT CHARSET=latin1
/*!50100 PARTITION BY HASH (user_id)
PARTITIONS 1000 */
这个表很大,大约有 1.5 亿条记录。
我有以下查询:
SELECT target_twitter_id
FROM `twitter_relationships`
WHERE (`twitter_relationships`.`relationship_status` = ?
AND `twitter_relationships`.`user_id` = ?
AND `twitter_relationships`.`source_twitter_id` = ?)
LIMIT ?, ?
这是此查询的解释:
id: 1
select_type: SIMPLE
table: twitter_relationships
type: ref
possible_keys: source_and_target,target_status_and_change_date_index,user_id_index
key: source_and_target
key_len: 12
ref: const,const
rows: 8560582
Extra: Using where
有什么想法可以在查询中甚至在表结构中加快查询速度吗?
可以说我有下表:
CREATE TABLE `my_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`relationship_status` varchar(48) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
假设这张表有很多记录:100M
我有 2 个可能的值relationship_status
:'following' 或 'not_following'
因为我想减小 DB 的大小(硬盘上的大小),如果我将其更改relationship_status
为 Boolean 而不是 varchar(48) 会有什么影响(如果可以将 0 定义为不跟随,1 定义为跟随)?
您将使用哪种列类型?微小的?
我目前有一个有 2 个从属的 Master,都运行 MySql 5.5。
我可以连接到单个主站的从站数量有哪些限制?应该考虑哪些参数?
我有一个主/从复制(使用 MySql 5.1 / InnoDB)。
目前我的主服务器和从服务器都在相同类型的服务器上运行(32 GB RAM,2 x Intel Xeon 5520 Quad Core 2.26 GHz(8 核))并且具有相同类型的配置(在 innodb_pool_size 等方面)
我正在考虑将我的主机升级到更强大的机器(48GB RAM,2 x Intel Xeon 5640 六核 2.26 GHz(12 核))。
我的问题是:是否可以只升级主机(增加他的 buffer_bool_size 等)并将从机留在当前设置?
我有一个数据库,其整个大小约为 44GB,其中 ibdata1 约为 35GB。这没有意义,因为数据的大小不应超过 10GB。
我使用以下查询来估计数据大小:
SELECT CONCAT(table_schema, '.', table_name),
CONCAT(ROUND(table_rows / 1000000, 2), 'M') rows,
CONCAT(ROUND(data_length / ( 1024 * 1024 * 1024 ), 2), 'G') DATA,
CONCAT(ROUND(index_length / ( 1024 * 1024 * 1024 ), 2), 'G') idx,
CONCAT(ROUND(( data_length + index_length ) / ( 1024 * 1024 * 1024 ), 2), 'G') total_size,
ROUND(index_length / data_length, 2) idxfrac
FROM information_schema.TABLES
ORDER BY data_length + index_length DESC
LIMIT 30;
任何想法如何清理 ibdata1 以及为什么它增长了这么多?
顺便说一句,我使用 innodb_file_per_table
我们公司的服务器目前托管在 VPS 上,我们决定迁移到专用服务器。
在为数据库服务器选择最佳硬件时,我们应该投入更多资源:更好的 CPU(更多内核)?或更多内存?
最佳投资回报率在哪里?
有什么建议么?
我正在尝试创建下表:
CREATE TABLE `s_relations_with_partition` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`source_persona_id` int(11) NOT NULL,
`relation_type` int(11) NOT NULL,
`message_id` int(11) DEFAULT NULL,
`reply_to_message_id` int(11) DEFAULT NULL,
`reshare_of_message_id` int(11) DEFAULT NULL,
`target_object_id` int(11) DEFAULT NULL,
`target_persona_id` int(11) DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`sent_at` int(11) DEFAULT NULL,
PRIMARY KEY (`id`,`sent_at`),
UNIQUE KEY `unique_target_persona` (`source_persona_id`,`relation_type`,`message_id`,`target_persona_id`),
UNIQUE KEY `unique_target_object` (`source_persona_id`,`relation_type`,`message_id`,`target_object_id`),
KEY `message_id_index` (`message_id`),
KEY `reshare_of_message_id_index` (`reshare_of_message_id`),
KEY `reply_to_message_id_index` (`reply_to_message_id`),
KEY `source_and_target_object_index` (`source_persona_id`,`target_object_id`),
KEY `source_target_persona_index` (`source_persona_id`,`target_persona_id`),
KEY `target_persona_relation_type_message_id_index` (`target_persona_id`,`relation_type`,`message_id`),
KEY `sent_at_index` (`sent_at`),
KEY `source_persona_sent_at_index` (`source_persona_id`,`sent_at`),
KEY `target_persona_sent_at_index` (`target_persona_id`,`sent_at`),
KEY `target_object_sent_at_index` (`target_object_id`,`sent_at`)
) ENGINE=InnoDB
PARTITION BY RANGE (sent_at) (
PARTITION p0 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-01-01 00:00:00') ),
PARTITION p1 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-02-01 00:00:00') ),
PARTITION p2 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-03-01 00:00:00') ),
PARTITION p3 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-04-01 00:00:00') ),
PARTITION p4 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-05-01 00:00:00') ),
PARTITION p5 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-06-01 00:00:00') ),
PARTITION p6 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-07-01 00:00:00') ),
PARTITION p7 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-08-01 00:00:00') ),
PARTITION p8 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-09-01 00:00:00') ),
PARTITION p9 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-10-01 00:00:00') ),
PARTITION p10 VALUES LESS THAN (MAXVALUE)
);
我收到以下错误:
A UNIQUE INDEX must include all columns in the table's partitioning function
无法将sent_at
(unix 时间戳)添加到唯一索引。
关于如何在该表上实现日期范围分区的任何想法?
我是 MySql 分区的新手,对索引有疑问。假设我有下表:
CREATE TABLE `members` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`member_rating` int(11) DEFAULT '0',
`persona_id` int(11) NOT NULL,
`high_value_type` int(11) DEFAULT NULL,
PRIMARY KEY (`id`,`user_id`),
UNIQUE KEY `user_id` (`user_id`,`persona_id`),
KEY `member_rating_index` (`member_rating`),
KEY `persona_index` (`persona_id`),
KEY `high_value_members_index` (`user_id`,`high_value_type`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
/*!50100 PARTITION BY HASH (user_id)
PARTITIONS 1000 */
据我了解,只要我在提供时查询表,一切都会正常工作user_id
,我的问题是:当我使用 out 进行查询时,表将如何执行user_id
,比如:
SELECT * FROM members where persona_id=3
有任何想法吗?
ps 我在 MySql 5.1 / innodb 上运行
我有以下表格:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`first_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`last_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`account_data` text COLLATE utf8_unicode_ci,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`twitter_username` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`crypted_password` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`password_salt` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`persistence_token` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`single_access_token` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`perishable_token` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`login_count` int(11) NOT NULL DEFAULT '0',
`failed_login_count` int(11) NOT NULL DEFAULT '0',
`last_request_at` datetime DEFAULT NULL,
`current_login_at` datetime DEFAULT NULL,
`last_login_at` datetime DEFAULT NULL,
`current_login_ip` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`last_login_ip` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`is_admin` tinyint(1) DEFAULT '0',
`referrer_id` int(11) DEFAULT NULL,
`partner` tinyint(1) DEFAULT '0',
`subscription_type` varchar(255) COLLATE utf8_unicode_ci DEFAULT 'free',
`workflow_state` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`persona_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `persona_index` (`persona_id`)
) ENGINE=InnoDB
和表格:
CREATE TABLE `user_actions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`action_type` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`module` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`data` text COLLATE utf8_unicode_ci,
`timestamp` datetime DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `user_id_index` (`user_id`),
KEY `action_type_index` (`action_type`),
KEY `user_action_type_index` (`user_id`,`action_type`),
KEY `timestamp_index` (`timestamp`),
KEY `user_id_timestamp_index` (`user_id`,`timestamp`)
) ENGINE=InnoDB
问题在于以下查询:
SELECT user_actions.*, users.twitter_username, users.email FROM `user_actions`
INNER JOIN users ON (user_actions.user_id=users.id) ORDER BY timestamp DESC LIMIT 0, 30
这是解释:
user_actions
The table was retrieved with this index: user_id_timestamp_index
You can speed up this query by querying only fields that are within the index. Or you can create an index that includes every field in your query, including the primary key.
Approximately 76 rows of this table were scanned.
users
This table was retrieved with a full table scan, which is often quite bad for performance, unless you only retrieve a few rows.
The table was retrieved with this index:
No index was used in this part of the query.
A temporary table was created to access this part of the query, which can cause poor performance. This typically happens if the query contains GROUP BY and ORDER BY clauses that list columns differently.
MySQL had to do an extra pass to retrieve the rows in sorted order, which is a cause of poor performance but sometimes unavoidable.
You can speed up this query by querying only fields that are within the index. Or you can create an index that includes every field in your query, including the primary key.
Approximately 3445 rows of this table were scanned.
这个查询需要很长时间才能执行,有什么想法可以改进吗?
我有一个 30GB 的 MySql 数据库,由 innoDB 表组成。目前表格字符集是:“utf8_unicode_ci”,我想将其更改为“utf8_general_ci”,最好的方法是什么?目前我正在遍历每张桌子并运行ALTER TABLE some_table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
它,这需要永远......有更好的方法吗?