我正在设计一个使用MySQL作为后端数据库的内部Web应用程序.数据的完整性至关重要,因此我将innoDB引擎用于其外键约束功能.
我想对一种类型的记录进行全文搜索,而innoDB表本身不支持这种记录.MyISAM由于缺少外键支持,我不愿意转移到表,因为它们的锁是每个表,而不是每行.
使用MyISAM引擎创建我需要搜索的记录的镜像表并将其用于全文搜索是不是不好的做法?这样我只是在搜索数据的副本,如果这些数据发生任何变化,那么它就没那么大了,因为它总是可以重新创建.
或者这是一种应该避免的尴尬方式吗?
谢谢.
我有2张桌子:comments和comments_likes.
评论
id
message
likes
Run Code Online (Sandbox Code Playgroud)
触发器:
删除后
DELETE FROM comments_likes WHERE comment_id = OLD.id;
Run Code Online (Sandbox Code Playgroud)
comments_likes
id
comment_id
Run Code Online (Sandbox Code Playgroud)
触发器:
插入后
UPDATE comments SET likes = likes + 1 WHERE comments.id = NEW.comment_id;
Run Code Online (Sandbox Code Playgroud)
删除后
UPDATE comments SET likes = likes - 1 WHERE comments.id = OLD.comment_id;
Run Code Online (Sandbox Code Playgroud)
更新后
**omited code, updates comments**
Run Code Online (Sandbox Code Playgroud)
所以问题是,我可以在从另一个触发器激活触发器时禁用触发器吗?
我想要的是做这样的事情:
删除后
IF NOT called_from_another_trigger() THEN
UPDATE comments SET likes = likes - 1 WHERE comments.id = OLD.comment_id;
END IF;
Run Code Online (Sandbox Code Playgroud)
[编辑]
一个非优化的解决方案是(非常慢的查询...对每个LIKE寄存器进行查询): …
我有MyISAM表的Mysql主从复制.所有更新都在主站上完成,选择在主站或从站上完成.
看来我们在进行某些更新时可能需要手动锁定几个表.虽然此写锁定在表上,但锁定表上不会发生任何选择.但奴隶呢?锁是否会传播出来?
假设我有table_A和table_B.我在主服务器上的table_A和table_B上启动锁定并开始执行更新.此时没有其他连接可以读取主机上的table_A和table_B吗?但是,如果此时另一个连接试图从一个奴隶读取表格,他们可以这样做吗?
有没有办法让我可以获得MySQL查询的时间(特别是使用PHP)?完成查询所花费的实际时间,即.
例如:结果1 - 10为棕色.(0.11秒)
我试图寻找一个例子,但无济于事.这是我的代码示例:
// prepare sql statement
$stmt = $dbh->prepare("SELECT ijl, description, source, user_id, timestamp FROM Submissions WHERE MATCH (ijl, description) AGAINST (?)");
// bind parameters
$stmt->bindParam(1, $search, PDO::PARAM_STR);
// execute prepared statement
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)
对于我目前使用MyISAM表引擎的全文搜索.任何帮助都会令人难以置信.谢谢.
谈到MySQL和PHPMyAdmin,我不是新手,但我比专家更接近新手.希望我要求的是可行的,并且有人会为我提供一个简单的,剪切n-paste SQL查询来实现它.
我需要将12个dbs中的9个表从MyISAM转换为InnoDB,我希望我可以使用单个查询在一个数据库中执行所有表,而不必单击并等待每个表中的每个表PHPMyAdmin中.基本上,有没有办法foo通过在PHPMyAdmin中运行的查询一次在多个表上运行"ALTER TABLE ENGINE = InnoDB"?
我将记录插入MySQL表,并尝试了解MyISAM表和InnoDB表之间的时间差异.
这是创建表的代码:
CREATE TABLE SpectrumData (
ID INT(11) NULL DEFAULT NULL,
`Set` INT(11) NULL DEFAULT NULL,
Wavelength DOUBLE NULL DEFAULT NULL,
Intensity DOUBLE NULL DEFAULT NULL,
Error INT(11) NULL DEFAULT NULL,
`Status` INT(11) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=xxx
ROW_FORMAT=DEFAULT
Run Code Online (Sandbox Code Playgroud)
我插入10000条记录,以秒为单位测量所需时间并重复100次.我把结果放在两个Excel图表中:

所以MyISAM增加和InnoDB或多或少不变.
谁能解释这些差异?与表中的记录数量有关?为什么这些异常值与InnoDB?
配置二手电脑:
更新:我应该提到我在Access前端应用程序中插入带有VBA脚本的记录.我通过ODBC系统DSN连接到MySQL数据库.
VBA代码:
Dim RsSpectrumData As DAO.Recordset
Dim Db As Database
Dim i As Integer
Dim j As Integer
Dim TimerStart
Set Db = CurrentDb …Run Code Online (Sandbox Code Playgroud) 那么如何在Doctrine 2中指定用于给定实体的存储引擎呢?
我正在创建一个需要全文索引的表,只有MyISAM存储引擎支持MySQL中的全文索引.
作为一方:看起来Doctrine 2不支持开箱即用的全文索引?也不是全文搜索?那是对的吗?
我的当前数据库与mysql有问题.
我有超过100个连接等待选择记录.当我执行:
show processlist;
Run Code Online (Sandbox Code Playgroud)
select查询是一个大查询,其他查询和插入,更新.
我有一个包含100个表的数据库,而select正在使用5个连接.
有没有办法临时停止进程并让其他进程运行,一旦所有进程完成,那么select可以继续运行?
在注意到我们的数据库已成为我们的实时生产系统的主要瓶颈后,我决定构建一个简单的基准来解决问题的根源.
基准测试:我计算在InnoDB表中增加相同行3000次所需的时间,其中行由其主键索引,并且正在更新的列不是任何索引的一部分.我使用在远程计算机上运行的20个并发客户端执行这3000次更新,每个客户端都有自己与数据库的单独连接.
我有兴趣了解为什么我对基准测试的不同存储引擎InnoDB,MyISAM和MEMORY拥有他们所做的配置文件.我也希望明白为什么InnoDB相比之差很大.
InnoDB(20个并发客户端):每次更新需要0.175秒.所有更新都在6.68s之后完成.
MyISAM(20个并发客户端):每次更新需要0.003秒.所有更新都在0.85秒后完成.
内存(20个并发客户端):每次更新需要0.0019秒.所有更新都在0.80秒后完成.
考虑到并发可能导致此行为,我还对单个客户端进行基准测试,并按顺序执行100次更新.
InnoDB:每次更新需要0.0026秒.
MyISAM:每次更新需要0.0006秒.
内存:每次更新需要0.0005秒.
实际的机器是Amazon RDS实例(http://aws.amazon.com/rds/),主要是默认配置.
我猜测答案将沿着以下几行:每次更新后InnoDB fsyncs(因为每次更新都是符合ACID的事务),而MyISAM则没有,因为它甚至不支持事务.MyISAM可能正在内存中执行所有更新,并定期刷新到磁盘,这是它的速度接近MEMORY存储引擎的方式.如果是这样,有没有办法使用InnoDB进行事务支持,但是可能会放松一些约束(通过配置),以便以一些持久性为代价更快地完成写入?
此外,任何有关如何提高InnoDB的性能的建议随着客户数量的增加而增加?它显然比其他存储引擎更糟糕.
更新
我找到了https://blogs.oracle.com/MySQL/entry/comparing_innodb_to_myisam_performance,这正是我想要的.设置innodb-flush-log-at-trx-commit = 2允许我们在出现电源故障或服务器崩溃的情况下放松ACID约束(每秒刷新一次磁盘).这给了我们与MyISAM类似的行为,但我们仍然可以从InnoDB中提供的事务功能中受益.
运行相同的基准测试,我们发现写入性能提高了10倍.
InnoDB(20个并发客户端):每次更新需要0.017秒.所有更新都在0.98秒后完成.
还有其他建议吗?
我的数据库中有以下两个表(索引不完整,因为它将基于我使用的引擎):
表格1:
CREATE TABLE `primary_images` (
`imgId` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
`imgTitle` varchar(255) DEFAULT NULL,
`view` varchar(45) DEFAULT NULL,
`secondary` enum('true','false') NOT NULL DEFAULT 'false',
`imgURL` varchar(255) DEFAULT NULL,
`imgWidth` smallint(6) DEFAULT NULL,
`imgHeight` smallint(6) DEFAULT NULL,
`imgDate` datetime DEFAULT NULL,
`imgClass` enum('jeans','t-shirts','shoes','dress_shirts') DEFAULT NULL,
`imgFamily` enum('boss','lacoste','tr') DEFAULT NULL,
`imgGender` enum('mens','womens') NOT NULL DEFAULT 'mens',
PRIMARY KEY (`imgId`),
UNIQUE KEY `imgDate` (`imgDate`)
)
Run Code Online (Sandbox Code Playgroud)
表2:
CREATE TABLE `secondary_images` (
`imgId` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
`primaryId` smallint(6) unsigned …Run Code Online (Sandbox Code Playgroud) myisam ×10
mysql ×10
innodb ×5
database ×3
php ×2
doctrine-orm ×1
locks ×1
performance ×1
phpmyadmin ×1
process ×1
replication ×1
search ×1
time ×1
triggers ×1