我们的网站每天有数百名访问者,每天有数万个查询.因此,数据库中的一些表很少更新,一些表每分钟更新几次,一些表更新〜每秒10次.
MyISAM使用表级锁定进行更新,InnoDb使用行级锁定.
因此,据我所知,对于频繁并发更新的表(每秒多次更新),最好将它们设为InnoDb,对于其他表(如果我们当然不需要事务和外键),可以使用MyISAM引擎.
我的想法是对的吗?
如果未在my.cnf中指定,innodb_data_file_path的默认设置是什么?
当我尝试在12GB充满图片的桌子上执行以下命令时
alter table `rails_production`.`pictures` change `data` `image_file_data` mediumblob NULL;
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
ERROR 1114 (HY000): The table '#sql-7fe4_12c9' is full
Run Code Online (Sandbox Code Playgroud)
我读了另一个StackOverflow问题链接文本,建议我将我的设置更改为以下内容
innodb_data_file_path = ibdata1:10M:autoextend:max:512M
Run Code Online (Sandbox Code Playgroud)
当我查看my.cnf时,我注意到我没有innodb_data_file_path的任何设置,我想知道默认值是什么?
我的表中有大约12GB的数据,而我的数据文件ibdata1的大小约为12GB.然后我运行以下命令
alter table `rails_production`.`pictures` change `data` `image_file_data` mediumblob NULL
Run Code Online (Sandbox Code Playgroud)
当它正在制作表的临时副本时,我收到以下错误
ERROR 1114 (HY000): The table '#sql-7fe4_12c9' is full
Run Code Online (Sandbox Code Playgroud)
我认为这意味着没有足够的空间来制作表的临时副本.但现在数据文件是17GB!如何回收数据文件中的空间?
有没有办法检查17GB的使用量是多少?
我有一个ip-to-country查找表.此表每月更新一次,同时非常频繁地阅读.我现在把它作为innodb.这是一个几乎只能从中读取的表的最佳表类型?
提前致谢.
可能重复:
MyISAM与InnoDB
好的,我读过维基百科和InnoDB的这些信息似乎更好.这是我的问题是否可以使用InnoDB而不是MyISAM从数据库中选择用户数据?或者与MyISAM保持联系会更好.
如果我要改为Inno PDO仍然可以使用它和一些旧式查询?
$q = ("SELECT * ... );
$r = mysql_query($q);
Run Code Online (Sandbox Code Playgroud) 我有一张桌子,每秒可以接收大约50个插页.现在有700k记录,使用160 MiB.我的小VPS与1公斤的公羊正在跟上,但几乎没有.
我之所以选择InnoDB,就像人们说"它扩展得更好",不那么频繁地腐败并实现行锁定而不是表锁定.
但这是正确的选择吗?
我也读过MyISAM支持延迟插入,这可能非常有趣.(我想知道表锁定的权衡取舍)
我有两张桌子:发票和invoice_items.我需要两者之间的一对多关系与级联删除(所以如果发票被删除,项目也会被删除).
发票上的主键跨越两列:invoice_number,vendor_number
invoice_items上的主键跨越三列:invoice_number,vendor_number,item_number
如何使用invoice_number&vendor_number列向invoice_items表添加外键约束?
我尝试过这个并没有用:
ALTER TABLE `invoice_items`
ADD FOREIGN KEY (`invoice_number`,`vendor_number`)
REFERENCES `invoices`(`invoice_number`,`vendor_number`) ON DELETE CASCADE;
ERROR 1005 (HY000): Can't create table 'test_db.#sql-12c8_db1ad' (errno: 150)
Run Code Online (Sandbox Code Playgroud)
以下是表定义:
CREATE TABLE IF NOT EXISTS `invoices` (
`vendor_number` varchar(20) NOT NULL,
`invoice_number` varchar(20) NOT NULL,
`po_number` varchar(50) NOT NULL,
`inbound_message_id` int(11) NOT NULL,
`created_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`vendor_number`,`invoice_number`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `invoice_items` (
`vendor_number` varchar(20) NOT NULL,
`invoice_number` varchar(20) NOT …Run Code Online (Sandbox Code Playgroud) 我有一张非常简单的桌子
CREATE TABLE IF NOT EXISTS `largecache` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`tooltip` varchar(255) NOT NULL,
`name` varchar(100) NOT NULL,
`attributes` text NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `tooltip` (`tooltip`)
) ENGINE=InnoDB
Run Code Online (Sandbox Code Playgroud)
大约有800万个条目几乎完全用于读取.我正在努力确保尽快访问数据.我目前正在使用InnoDB,是否值得切换到MyISAM?我唯一关心的是读取性能.此外,我可以使用任何其他建议加速,因为数据库读取几乎是我应用程序中唯一的瓶颈.
我正在使用MySQL客户端版本:5.1.47
谢谢.
[编辑:更多细节]我正在使用php,我正在查询基于工具提示字段的完全匹配.它被托管在一个共享的VPS上,有1个内存,我可以尝试对mysql进行任何调整,但我知道mysql调整是一个非常复杂的问题.
示例查询:
select * from largecache where `tooltip` = "Cm8IuIyq9QMSBwgEFS0iGWAd30SUNR2EHJ0nHYYCY-odxZ6okR0pEnPgHWzQbvIiCwgBFXZCAwAYCCAiMAk4_gNAAEgPUBBg_gNqJQoMCAAQvKHZ5oCAgIA6EhUIrcC1xggSBwgEFUn1i18wCTgAQAEY2ojJgQxQAlgA"
Run Code Online (Sandbox Code Playgroud)
我确实安装了APC,但没有安装memcached
我不确定行级别锁如何工作但这里是我的问题我有一个表T(id int,balance int)(engine = InnoDB)我想要锁定ID = 1的行,所以我开始像这个 :
start transaction ;
select * from T where ID = 1 FOR UPDATE ;
Run Code Online (Sandbox Code Playgroud)
在发送提交之前,我想尝试确实行是否已锁定.所以我开始了另一个会话并输入:
UPDATE T set balance = balance + 100 where ID = 1 ;
Run Code Online (Sandbox Code Playgroud)
在这里,我清楚地看到我在等待锁定(30秒后超时).
但是当我键入:
UPDATE T set balance = balance + 8500 where ID = 2 ;
Run Code Online (Sandbox Code Playgroud)
我也在等待锁定,那么我怎样才能锁定ID = 1行而不是完全锁定表格?
innodb ×10
mysql ×10
myisam ×5
database ×4
foreign-keys ×1
java ×1
locking ×1
locks ×1
sql ×1
transactions ×1