我正在尝试将大约5亿行垃圾数据插入数据库进行测试.现在我有一个PHP脚本循环遍历一些SELECT/INSERT语句TRANSACTION - 显然这不是最好的解决方案.表是InnoDB(行级锁定).
我想知道我(正确)分叉过程,这会加快这个INSERT过程吗?按照它的速度,需要140个小时才能完成.我关心两件事:
如果INSERT语句必须获取写锁定,那么它会使forking无用,因为多个进程不能同时写入同一个表吗?
我正在使用SELECT...LAST_INSERT_ID()(内部TRANSACTION).当多个进程INSERT进入数据库时,这种逻辑是否会中断?我可以为每个fork创建一个新的数据库连接,所以我希望这可以避免这个问题.
我应该使用多少个进程?查询本身很简单,我有一个带2GB RAM的常规双核开发盒.我设置我的InnoDB使用8个线程(innodb_thread_concurrency=8),但我不确定我是否应该使用8个进程,或者这是否是考虑匹配的正确方法.
谢谢你的帮助!
CREATE TABLE accounts (
account_name VARCHAR(100) NOT NULL PRIMARY KEY
);
CREATE TABLE products (
product_id INTEGER NOT NULL PRIMARY KEY,
product_name VARCHAR(100)
);
CREATE TABLE bugs (
bug_id INTEGER NOT NULL PRIMARY KEY,
bug_description VARCHAR(100),
bug_status VARCHAR(20),
reported_by VARCHAR(100) REFERENCES accounts(account_name),
assigned_to VARCHAR(100) REFERENCES accounts(account_name),
verified_by VARCHAR(100) REFERENCES accounts(account_name)
);
CREATE TABLE bugs_products (
bug_id INTEGER NOT NULL REFERENCES bugs,
product_id INTEGER NOT NULL REFERENCES products,
PRIMARY KEY (bug_id, product_id)
);
Run Code Online (Sandbox Code Playgroud)
如果我执行'describe bugs_products'我得到:
Field | Type | Null | …Run Code Online (Sandbox Code Playgroud) 我有一个基于PHP和MySQL的在线游戏(PHP 5.2.9和MySQL 5.0.91).最近我遇到的问题是,当我在表中删除数千行旧数据时,整个站点有时会冻结.当查询必须等待我假设的表锁并且游戏无法按预期运行时,我也遇到了奇怪的事情发生的问题.
我的所有表都是MyISAM,每秒运行900多个查询.在整个数据库(约150个表)中,88%的查询是读取,只有12%的写入,但是一些表更接近50/50并且每秒从各种客户端读取和写入大量数据(这是一个多人游戏).这些表还可存储1M-5M行.
我知道MyISAM应该读得更快,但InnoDB不必在写入时锁定整个表.我在这里和其他网站上经历了很多主题,但我仍然不确定如何解决这些问题.
我有一个MySQL数据库和一个innoDB表.我有一个连接的php页面,锁定表,进行一些更新,然后解锁表.PHP页面正在通过wamp提供apache.
php页面将文件上传到数据库.我决定通过上传一个大小比分配给PHP的内存大小的文件来模拟系统崩溃.这肯定导致了这个错误:允许18874368字节的内存大小耗尽(试图分配6176754字节).之后,更新期间锁定的表仍处于锁定状态.
我在尝试访问此错误后访问表时得到的错误是:表'a'未使用LOCK TABLES锁定.我知道这是一个锁定问题,因为我将调出一个SQL提示并尝试从已锁定的表中进行选择,它只是等待,就像锁定表时一样.如果我然后杀死Apache进程,我试图在SQL提示符中运行的语句将最终通过.我的猜测是,当我杀死Apache进程时,MySQL意识到应该释放表锁,因为连接被切断了.
有任何想法吗??
直到最近,当我决定开始担心参照完整性等时,我一直在使用MyISAM并且没有定义明确的外键关系.
我正在研究一个存储战斗事件,战斗机统计数据的数据库,所以我认为这符合使用InnoDB和明确定义外键的标准.
我有一个战斗机表,其中有多个列是外键.我想知道是否建议始终明确定义外键关系,无论表中引用了多少外键?
特别是,对于这个表我有:
CREATE TABLE `fights` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`event_id` int(10) unsigned DEFAULT NULL,
`winner_id` int(10) unsigned DEFAULT NULL,
`referee_id` int(10) unsigned DEFAULT NULL,
`championship_match` enum('1','0') DEFAULT NULL,
`weight_class` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)
我打算做referee_id,winner_id,event_id所有外键各自表ID列.这是要走的路吗?或者,为了性能原因,我是否应该以关系完整性为代价限制明确定义的外键数量?
使用默认引擎(MyIsam),我可以使用以下语法创建外键:
alter table `codes` add constraint foreign key(`associated_code_id`) references ask_codes(code_id) on update cascade on delete cascade;
Run Code Online (Sandbox Code Playgroud)
但是,当我使用INNODB创建表时,我不再能够创建外键(mysql给我ERROR 1005(HY000):无法创建表'my_table.#sql-3311_16115'(错误号:150)).
这是语法问题吗?谢谢您的帮助,
数据库已有多达25-30个表,所有表都是MyISAM.这些表中的大多数彼此相关,这意味着许多查询使用ID上的连接并检索数据.
其中一个表包含7-10百万条记录,如果我想执行搜索或更新甚至检索所有数据,它会变慢.现在我向我的老板提出了一个解决方案,即将表转换为InnoDB可能会提供更好的性能.
我还解释了InnoDB的好处:
由于我们总是在键上连接多个表并且它们是相关的,因此最好使用外键并使用关系数据库来避免孤立行.我在其中一张大桌子里发现了大约10-15k孤儿行,不得不手动删除它们.
支持事务,我们不时执行大的更新,如果其中一个失败,我们必须用备份的表替换整个表并再次运行更新以确保所有查询都已执行.使用InnoDB,如果查询2失败,我们可以恢复查询1的任何更改.
现在我从老板得到的回应是我需要证明InnoDB的运行速度比MyISAM快.我的问题是,通过消除孤立行,不会超过2件事情提高应用程序本身的速度吗?
一般来说MyISAM比InnoDB更快吗?
注意:使用MySQL 5.5
我试图通过Python使用以下代码将值插入表中:
db = MySQLdb.connect(host="localhost",user="root",passwd="", db="x")
db.autocommit(True)
cur = db.cursor()
query = """INSERT INTO b (source_id,text,author,score,type,location) VALUES (%s,%s,%s,%s,%s,%s)""" % (1,Tweet.text,User.screen_name,score,search_type,User.location)
print query
cur.execute(query)
Run Code Online (Sandbox Code Playgroud)
我看到查询字符串正确填充了打印输出中的所有变量值(我没有对特殊字符做任何事情).但是这些值根本没有插入到数据库中.我的表看起来像这样:
| freebee | CREATE TABLE `b` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`source_id` int(5) NOT NULL,
`text` varchar(255) NOT NULL,
`author` varchar(120) DEFAULT NULL,
`score` tinyint(3) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`start_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`end_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`type` enum('food','event','stuff') NOT NULL,
`location` varchar(120) …Run Code Online (Sandbox Code Playgroud) 在我的配置innodb_flush_method=O_DSYNC中O-DIRECT减少了大约75%的iowait,因此这就是负载.我应该设置除innodb_flush_method之外的其他变量来减少更多的iowait吗?
我的配置文件是:
[mysqld]
innodb_file_per_table=1
query_cache_size=128M
thread_cache_size=64
key_buffer_size=32M
max_allowed_packet=16M
table_cache=1024
table_definition_cache=8192
wait_timeout=20
max_user_connections=25
innodb_flush_method=O_DSYNC
open_files_limit=16384
myisam_sort_buffer_size=2M
collation_server=utf8_unicode_ci
character_set_server=utf8
tmp_table_size = 384M
max_heap_table_size = 384M
innodb_buffer_pool_size=64M
innodb_thread_concurrency=8
max_connections=125
Run Code Online (Sandbox Code Playgroud)
我有一个包含100个Innodb表的数据库,其中3个有大约25000个记录,其他没有重要记录.高峰期的平均查询大约是160,大多数是SELECT
谢谢
据我所知,InnoDB索引的最大长度为767字节.
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(254) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
.....
`token` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`rank` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `user_token_index` (`token`),
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Run Code Online (Sandbox Code Playgroud)
我想在我的电子邮件上创建索引.
alter table agent add UNIQUE index idx_on_email (email);
Run Code Online (Sandbox Code Playgroud)
但得到了错误信息:
指定密钥太长; 最大密钥长度为767字节.
但令牌列的长度只有128个字节,电子邮件是254个字节,不超过767个字节.希望有人能帮助我!提前致谢!