我正在学习数据库的数据类型的用法.
例如:
为什么我要特别提到innodb?
除非您使用InnoDB表类型(请参阅第11章"高级MySQL"以获取更多信息),否则CHAR列的访问速度比VARCHAR快.
我们有一个MySQL InnoDB表,包含~10列小base64编码的javascript文件和png(<2KB大小)图像base64编码.
相对较少的插入和大量读取,但是输出被缓存在Memcached实例上几分钟以避免后续读取.
现在我们正在使用BLOB这些列,但我想知道TEXT在性能或快照备份方面是否有转换到数据类型的优势.
我的搜索挖掘表明,BLOB和TEXT我的情况接近相同的,因为我不知道前手什么类型的数据实际上将被存储我去了BLOB.
对于这个具体案例,你对TEXT vs BLOB辩论有什么指示吗?
我有一个相当大的InnoDB表,其中包含大约1000万行(并且计数,它预计将变为该大小的20倍).每一行都不是那么大(平均每个131 B),但我不得不删除一大块,这需要很长时间.这是表结构:
CREATE TABLE `problematic_table` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`taxid` int(10) unsigned NOT NULL,
`blastdb_path` varchar(255) NOT NULL,
`query` char(32) NOT NULL,
`target` int(10) unsigned NOT NULL,
`score` double NOT NULL,
`evalue` varchar(100) NOT NULL,
`log_evalue` double NOT NULL DEFAULT '-999',
`start` int(10) unsigned DEFAULT NULL,
`end` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `taxid` (`taxid`),
KEY `query` (`query`),
KEY `target` (`target`),
KEY `log_evalue` (`log_evalue`)
) ENGINE=InnoDB AUTO_INCREMENT=7888676 DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)
从表中删除大块的查询就像这样:
DELETE FROM problematic_table WHERE problematic_table.taxid …Run Code Online (Sandbox Code Playgroud) 我想检查是否使用 查询为每个数据库表innodb_file_per_table设置(即.ibd创建)MYSQL-5.5.
有办法吗?
我在MySQL表中遇到死锁.只涉及一个表,我可以一致地重现它.它只发生在我运行代码的多个线程时.
这是表格:
CREATE TABLE `users_roles` (
`role_id` bigint(20) NOT NULL,
`user_id` bigint(20) NOT NULL,
`created` datetime NOT NULL,
PRIMARY KEY (`user_id`,`role_id`),
KEY `created` (`created`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
然后,我在每个线程中运行这两个查询,每个线程对user_id具有不同的值.
BEGIN;
DELETE FROM `users_roles` WHERE user_id = X;
INSERT INTO `users_roles` VALUES (7, X, NOW()); -- DEADLOCK ON THIS QUERY
COMMIT;
Run Code Online (Sandbox Code Playgroud)
应该注意,当调用DELETE语句时,user_id X 在数据库中永远不存在.运行这些查询的代码位用于创建新用户.但是,该功能允许我修改用户所在的帐户,并因此从旧用户的团队中删除现有角色.
因此,当足够的这些查询并行运行时,我开始遇到死锁.InnoDB状态的死锁部分在每次死锁后显示此信息.
------------------------
LATEST DETECTED DEADLOCK
------------------------
2014-05-09 16:02:20 7fbc99e5f700
*** (1) TRANSACTION:
TRANSACTION 6241424274, ACTIVE 0 sec inserting
mysql tables in use 1, …Run Code Online (Sandbox Code Playgroud) 2016-03-14 02:30:29 58150 [错误] InnoDB:无法锁定./ibdata1,错误:35 2016-03-14 02:30:29 58150 [注意] InnoDB:检查你还没有另一个mysqld进程使用相同的InnoDB数据或日志文件.
MySQL 5.7引入了一个新文件ibtmp1,用于在InnoDB中存储临时数据以提高性能.
但我注意到它的大小不断增加.在我的数据库服务器上,它的大小增加到92GB.
有没有办法减少大小或删除文件而不重新启动服务器?
谢谢
我正在设计一个使用MySQL作为后端数据库的内部Web应用程序.数据的完整性至关重要,因此我将innoDB引擎用于其外键约束功能.
我想对一种类型的记录进行全文搜索,而innoDB表本身不支持这种记录.MyISAM由于缺少外键支持,我不愿意转移到表,因为它们的锁是每个表,而不是每行.
使用MyISAM引擎创建我需要搜索的记录的镜像表并将其用于全文搜索是不是不好的做法?这样我只是在搜索数据的副本,如果这些数据发生任何变化,那么它就没那么大了,因为它总是可以重新创建.
或者这是一种应该避免的尴尬方式吗?
谢谢.
当我在innodb表上运行优化表时,我收到此消息.是否意味着该表已经过优化,但是以不同的方式?
"table | optimize | note |表不支持优化,而是重新创建+分析而不是|"
我有一个单词列表.让我们说它们是'Apple','Orange'和'Pear'.我在数据库中有这样的行:
------------------------------------------------
|author_id | content |
------------------------------------------------
| 54 | I ate an apple for breakfast. |
| 63 | Going to the store. |
| 12 | Should I wear the orange shirt? |
------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个返回第1行和第3行的InnoDB表的查询,因为该content列包含我列表中的一个或多个单词.我知道我可以为列表中的每个单词查询一次表,并使用LIKE和%通配符,但我想知道是否有一个查询方法可用于这样的事情?