此代码应该获取或创建一个对象,并在必要时更新它.该代码在网站上正在生产中使用.
在某些情况下 - 当数据库繁忙时 - 它将抛出异常"DoesNotExist:MyObj匹配查询不存在".
# Model:
class MyObj(models.Model):
thing = models.ForeignKey(Thing)
owner = models.ForeignKey(User)
state = models.BooleanField()
class Meta:
unique_together = (('thing', 'owner'),)
# Update or create myobj
@transaction.commit_on_success
def create_or_update_myobj(owner, thing, state)
try:
myobj, created = MyObj.objects.get_or_create(owner=user,thing=thing)
except IntegrityError:
myobj = MyObj.objects.get(owner=user,thing=thing)
# Will sometimes throw "DoesNotExist: MyObj matching query does not exist"
myobj.state = state
myobj.save()
Run Code Online (Sandbox Code Playgroud)
我在ubuntu上使用innodb mysql数据库.
我该如何安全地处理这个问题?
我有一个很大但很窄的InnoDB表,记录大约9米.在桌子上count(*)或count(id)桌子上做的非常慢(6秒以上):
DROP TABLE IF EXISTS `perf2`;
CREATE TABLE `perf2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`channel_id` int(11) DEFAULT NULL,
`timestamp` bigint(20) NOT NULL,
`value` double NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ts_uniq` (`channel_id`,`timestamp`),
KEY `IDX_CHANNEL_ID` (`channel_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
RESET QUERY CACHE;
SELECT COUNT(*) FROM perf2;
Run Code Online (Sandbox Code Playgroud)
虽然声明不经常运行,但优化它会很好.根据http://www.cloudspace.com/blog/2009/08/06/fast-mysql-innodb-count-really-fast/,这可以通过强制InnoDB使用索引来实现:
SELECT COUNT(id) FROM perf2 USE INDEX (PRIMARY);
Run Code Online (Sandbox Code Playgroud)
解释计划似乎很好:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE perf2 index NULL PRIMARY 4 …Run Code Online (Sandbox Code Playgroud) PHPMyAdmin中的常见问题是这样说的关于InnoDB的它的大致行数:
phpMyAdmin使用快速方法来获取行计数,并且此方法仅返回InnoDB表的大致计数.
我想使用这种"快速方法" - 但我搜索的每个地方似乎都有不同的答案.
有人知道吗?
最近,我发现如果我有好的硬件,我可以最大化mysql性能.由于我一直在使用InnoDB,我在my.ini中添加了额外的配置
这是新添加的配置:
innodb_data_file_path = ibdata1:10M:autoextend
innodb_buffer_pool_size = 2G
innodb_additional_mem_pool_size = 2M
innodb_log_file_size = 256M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 120
Run Code Online (Sandbox Code Playgroud)
然后我重新启动所有服务.但是当我使用我的程序时,出现错误"未知的表引擎'InnoDB'".
我试图解决这个问题:
我被要求检查Mariadb,因为Centos暂时不提供MySQL 5.5.我已经读过xtradb服务器作为innodb的一个下降.
使用一个或另一个有什么好处,因为如果它们相同,它们就不会被称为同名?
你认为我应该转向Mariadb吗?由于更新(如果有的话),我将来可能遇到什么样的问题.
我知道MySQL的创始人是Mariadb的后盾,Oracle现在正在管理MySQL.作为一个棘手的决定似乎有点棘手.
提前感谢您的意见,
更新,我问这里的问题,因为谷歌没有显示任何最近的更新.只有一些旧的比较在2012年之前发布
我已经多次读过你在MySQL中的InnoDB表中删除一行后,它的空间没有被重用,所以如果你把很多INSERT放到一个表中然后定期删除一些行,那么表将使用越来越多的空间磁盘,好像根本没有删除行.
最近我被告知,删除行占用的空间会被重用,但只有在某些事务完成后才会被重新使用 - 不完全.我现在很困惑.
有人可以帮我理解这个吗?我需要在InnoDB表中执行大量的INSERT,然后每隔X分钟我需要删除超过Y分钟的记录.我在这里有一个不断增长的InnoDB表的问题,还是偏执狂?
当我在MySQL中执行查询时,它返回一个错误,指出InnoDB未启用.当我点击存储引擎时,InnoDB被禁用.
如何启用InnoDB?
我一直在MySQL服务器中遇到脏页刷新问题.由于服务器中缺少资源,这会占用大量CPU资源并导致我的网站崩溃.我在数据库中获得了1000万条记录,并将进一步增长.我的表在innodb中运行,从基于事务的站点开始,我需要innodb.将迁移到Percona服务器将删除我的脏页刷新问题.一般来说迁移或坚持使用MySQL会更好吗?
一旦我搬到percona,如果我想恢复到Mysql,我可以将备份从percona恢复到mysql吗?
我有一个myism表'test',它包含一些过时的数据,现在我想重新创建表,所有列都相同,只不过我将存储从myism更改为innodb.我用来重新创建表的转储sql如下:
drop table test;
create table test ( ... )
engine=innodb
insert into test(...) values(...)
Run Code Online (Sandbox Code Playgroud)
这就是我收到错误"从存储引擎得到错误-1"的地方,我用Google搜索,大部分结果都集中在损坏的innodb表上.虽然对于我的情况,我认为它没有被破坏,但这只是我在丢弃时遗漏并创建语句的东西.
另一件事是,在执行了上面的sql之后,剩下的用于表测试的是一个名为file.frm的文件,我想innodb表需要运行一些其他东西,但不确定是什么.
我该如何解决这个问题?我可能需要做更多这类任务,什么是放弃神话表并将其重新创建为innodb的正确程序?
谢谢.
我有一个庞大而繁重的mysql数据库,有时执行速度非常快,但有时会变得非常慢.所有表都是InnoDB,服务器有32GB的RAM,数据库大小约为40GB.
前20个查询我slow_query_logARE update,insert以及delete查询和我不明白他们为什么这么慢(长达120秒,有时!)
这是最常见的查询:
UPDATE comment_fallows set comment_cnt_new = 0 WHERE user_id = 1;
Run Code Online (Sandbox Code Playgroud)
分析结果:
mysql> set profiling = 1;
Query OK, 0 rows affected (0.00 sec)
mysql> update comment_fallows set comment_cnt_new = 0 where user_id = 1;
Query OK, 0 rows affected (2.77 sec)
Rows matched: 18 Changed: 0 Warnings: 0
mysql> show profile for query 1;
+---------------------------+----------+
| Status | Duration |
+---------------------------+----------+
| starting …Run Code Online (Sandbox Code Playgroud) innodb ×10
mysql ×9
database ×2
count ×1
django ×1
mariadb ×1
percona ×1
performance ×1
replication ×1
rows ×1
size ×1
sql ×1
transactions ×1
xtradb ×1