我有一个包含大约30个表的数据库,其中5个表是写密集型的.
我在考虑
转换5个写密集型表以使用InnoDB引擎,并将其余部分保留在MyISAM引擎上
转换所有表以使用InnoDB引擎.
我想知道哪种方法更好?
更具体
我想在MyISAM引擎上保留一些表的原因是它们中的一些有大约1,000,000行.我不确定转换为InnoDB后这些表上的"SELECT COUNT(*)"查询会有多慢.
我没有做过测试.在开始转换之前,我更喜欢从你们这里得到一些建议.
有时我被问到一些采访:InnoDB对MyISAM有什么好处,MyISAM比InnoDB好?关于问题的第一部分,一切都很清楚:InnoDB是交易兼容的,行级阻塞而不是表级阻塞,外键支持和其他一些,这些点只是浮现在脑海中.
但是当MyISAM真的比InnoDB好吗?
无论如何,我可以将一个完整填充的MyISAM数据库转换为InnoDB(以某种方式创建所有外键约束,就像我从头开始运行syncdb命令一样)?
我目前正在为MySQL中的所有数据库使用InnoDB,但是我注意到我的information_schema数据库使用MyISAM来处理非MEMORY的表.
我正在调查InnoDB/MyISAM问题.虽然我不认为这是它的原因,但我担心这种混合.该数据库最初是使用MyISAM设置的.之后更新了my.cnf文件,将引擎重置为InnoDB.我正在使用MySQL 5.5.10.
将information_schema数据库设置为MyISAM可能会出现哪些问题,但是所有其他数据库都设置为MySQL?
对于那些寻求帮助的人: 如果您在寻找答案时遇到此问题或想要了解更多信息,请查看您的默认数据库引擎:
show variables;
Run Code Online (Sandbox Code Playgroud)
要查看分配给数据库中表的引擎:
show table status;
Run Code Online (Sandbox Code Playgroud)
我的my.cnf设置:
[client]
default-character-set=utf8
[mysqld]
log=/usr/local/var/mysql/mysqld.log
character-set-server = utf8
collation-server = utf8_general_ci
lower_case_table_names=2
default_storage_engine=InnoDB
# Performance hacks:
innodb_flush_method=nosync
innodb_flush_log_at_trx_commit=0
Run Code Online (Sandbox Code Playgroud) 我们正在运行一个社交网站,记录每个成员的行为(包括访问其他成员的页面); 这涉及到db的大量写入.这些操作存储在MyISAM表中,并且由于某些东西开始对CPU征税,我首先想到的是MyISAM的表锁定会对CPU造成这种压力.
由于目前分区的mySQL数据库不支持外键,我想听一些读取繁重的应用程序的专业版和内容,每个表将处理大约1-400 000行.不幸的是,我在这方面还没有足够的经验来自己做出结论......
非常感谢!
参考文献:
我想知道我是否将一些表从MyISAM转换为InnoDB,是否会导致数据损坏?
我需要将一些表转换为InnoDB,因此我可以使用事务,但它们持有非常重要的数据,因此我不确定是否应该进行转换.
我正在Symfony2中构建一个应用程序,使用Doctrine2和mysql.我想使用全文搜索.我找不到如何实现这一点 - 现在我仍然坚持如何将表引擎设置为myisam.
似乎无法使用注释设置表类型.另外,如果我通过运行"ALTER TABLE"查询手动完成,我不确定Doctrine2是否会继续正常工作 - 它是否依赖于InnoDB外键?
有没有更好的地方提出这些问题?
问题很简单,但我找不到一个确切的答案:在myisam数据库中,如果一个php文件锁定一个表(带有原子操作,比如一个INSERT),另一个php文件试图访问同一个表,会发生什么?读书还是写作?
现在,虽然很明显第二个会话将无法访问该表,但到底发生了什么?它会返回某种错误吗?在它能够访问之前它是否在队列中等待?
可能重复:
如何删除重复的行?
仅使用MySQL查询删除重复项?
我有一个大约14M条目的大桌子.表类型是MyISAM而不是InnoDB.
不幸的是,我在这个表中有一些重复的条目,我发现有以下请求:
SELECT device_serial, temp, tstamp, COUNT(*) c FROM up_logs GROUP BY device_serial, temp, tstamp HAVING c > 1
Run Code Online (Sandbox Code Playgroud)
为了避免将来出现这些重复,我想使用SQL请求将当前索引转换为唯一约束:
ALTER TABLE up_logs DROP INDEX UK_UP_LOGS_TSTAMP_DEVICE_SERIAL,
ALTER TABLE up_logs ADD INDEX UK_UP_LOGS_TSTAMP_DEVICE_SERIAL ( `tstamp` , `device_serial` )
Run Code Online (Sandbox Code Playgroud)
但在此之前,我需要清理我的副本!
我的问题是:如何只保留一份重复条目?请记住,我的表包含14M条目,所以如果可能的话我想避免循环.
欢迎任何评论!
myisam ×10
mysql ×9
innodb ×7
concurrency ×1
django ×1
doctrine-orm ×1
foreign-keys ×1
partitioning ×1
sql ×1