我们有一个大约70GB的InnoDB数据库,我们预计在未来的2到3年内它会增长到几百GB。 大约60%的数据属于一个表格。 目前数据库运行良好,因为我们有一个64 GB RAM的服务器,所以几乎整个数据库都适合内存,但是当数据量会大得多时,我们担心未来。 现在我们正在考虑某种方式来分割表格(特别是那些占据最大部分数据的表格),现在我想知道,最好的办法是什么。 我目前知道的选项是 使用版本5.1附带的MySQL分区 使用某种封装数据分区的第三方库(如hibernate shards) 在我们的应用程序中实现它自己 我们的应用程序基于J2EE和EJB 2.1(希望有一天我们可以切换到EJB 3)。 你会build议什么? 编辑(2011-02-11): 只是更新:目前数据库的大小是380 GB,我们的“大”表的数据大小是220 GB,其索引的大小是36 GB。 所以当整个表格不再适合记忆的时候,索引就是这样。 系统仍然运行良好(仍然在同一个硬件上),我们仍然在考虑对数据进行分区。 编辑(2014-06-04):多一个更新:整个数据库的大小是1.5TB,我们的“大”表的大小是1.1TB。 我们将服务器升级到具有128 GB RAM的4处理器机器(Intel Xeon E7450)。 系统仍然运行良好。 接下来我们要做的是把我们的大桌子放在一个单独的数据库服务器上(我们已经对软件进行了必要的修改),同时升级到具有256GB RAM的新硬件。 这种设置应该持续两年。 然后,我们要么终于开始实施分片解决scheme,要么只购买带有1TB内存的服务器,这将使我们保持一段时间。 编辑(2016-01-18): 我们已经把自己的数据库放在一个单独的服务器上。 目前该数据库的大小约为1.9TB,其他数据库的大小(除“大”之外的所有表)为1.1TB。 当前硬件设置: 惠普ProLiant DL 580 4个Intel(R)Xeon(R)CPU E7-4830 256 GB RAM 这个设置的性能很好。
我很欣赏数据库表中NULL值的语义,与假string和空string''不同。 但是,当字段为空时,我经常阅读性能问题,并build议在NULL实际上语义上正确的情况下使用空string。 哪些情况适合使用可空字段和空值? 什么是权衡? 简单地避免使用NULL是明智的,只需使用空string,false或0表示缺less值? UPDATE 好的 – 我理解“NULL”和“NULL”是适合的字段值的(性能不可知)情况之间的语义差异。 但是,让我展开暗示的性能问题。 这是来自Schwartz,Zeitsev等人出色的“高性能MySQL” http://www.borders.co.uk/book/high-performance-mysql-optimization-backups-replication-and-more/857673/ : MySQL更难以优化引用可空的coumns的查询,因为它们使得索引,索引统计和值比较更加复杂。 一个可为空的列使用更多的存储空间,并需要MySQL内的特殊处理。 当一个可空列被索引时,它需要每个条目多一个字节,甚至可以在MyISAM中将固定大小的内联(如单个整数列上的索引)转换为可变大小的列。 更多这里: Google书籍预览 这很可能是一个明确的答案 – 我只是从第一线寻找第二个意见和经验。
我有一个包含瑞典/挪威string的数据库表。 当我查询一些数据,我得到这样的输出: 输出set names latin1; +———————————–+ | name | +———————————–+ | Kid Interi##### | | Bwg Homes | | If Skadef####kring | | Jangaard Export | | Nordisk Film | +———————————–+ 现在,如果我set names utf8; 为了看到具有适当编码的字符,MySQL命令行的表格输出的格式会被破坏。 输出set names utf8; +———————————–+ | name | +———————————–+ | Kid Interiør | | Bwg Homes | | If Skadeförsäkring | […]
例如: ALTER TABLE webstore.Store MODIFY COLUMN ( ShortName VARCHAR(100), UrlShort VARCHAR(100) ); 以上是不行的。 我正在使用MySql 5.x
我有一个与utf8通用ci整理MySQL表。 在表格中,我可以看到两个条目: 阿巴德 阿巴德 我正在使用这样的查询: SELECT * FROM `words` WHERE `word` = 'abád' 查询结果给出了两个词: 阿巴德 阿巴德 有没有办法表明我只希望MySQLfind重音词? 我想查询只返回 阿巴德 我也试过这个查询: SELECT * FROM `words` WHERE BINARY `word` = 'abád' 它给我没有结果。 感谢您的帮助。
我的团队正在与使用Solr作为search索引的第三方CMS进行合作。 我注意到,似乎作者正在使用Solr作为sorting数据库,每个返回的文档都包含两个字段: Solr文档ID(基本上是一个类名和数据库ID) 整个对象的XML表示 所以基本上它运行一个针对Solr的search,下载对象的XML表示,然后从XML实例化对象,而不是使用id在数据库中查找它。 我的直觉告诉我这是一个不好的做法。 Solr是一个search索引,而不是数据库…所以对我来说,执行我们对Solr的复杂search,获取文档ID,然后从数据库中拉出相应的行更有意义。 当前的实现是否完美无缺,还是有数据支持重构的时机? 编辑:当我说“XML表示” – 我的意思是一个存储的字段包含所有对象的属性的XMLstring,而不是多个存储的字段。
我需要移动现有列的位置(为了更好的可视性)。 这怎么做,而不影响数据?
我在MySQL数据库中有一堆的任务,其中一个字段是“截止date”。 并不是每个任务都必须有截止date。 我想用SQL按截止date对任务进行sorting,但在结果集的后面放置没有最后期限的date。 就像现在一样,无效date首先显示,其余按最早的截止datesorting。 任何关于如何单独使用SQL的想法? (如果需要的话,我可以用PHP来完成,但是只有SQL的解决scheme会很棒。) 谢谢!
我一直在看Redis。 它看起来很有趣。 但是从实际的angular度来看,在什么情况下使用Redis来处理MySQL会更好?
在某些情况下,在生产环境中运行UPDATE语句可以节省一天的时间。 然而,borked更新可能比最初的问题更糟糕。 在使用testing数据库之前,有哪些选项可以告诉更新语句在运行之前会做什么?