我正在尝试使用CLI脚本更新LARGE MyISAM表(2500万条记录).该表未被其他任何东西锁定/使用.
我想而不是为每条记录做单个UPDATE查询,我不妨使用CASE功能.
该id领域是主要的.我怀疑以下查询应该花费几毫秒.
UPDATE `table` SET `uid` = CASE
WHEN id = 1 THEN 2952
WHEN id = 2 THEN 4925
WHEN id = 3 THEN 1592
END
Run Code Online (Sandbox Code Playgroud)
瞧,查询占用了CPU,并没有永远完成.
然后,令我惊讶的是,我发现查询正在更新所有2500万行,在我没有指定的行上放置NULL.
那是什么意思?我是否可以在每次执行此查询时仅对特定行执行MASS更新而不更新2500万行?或者我是否必须进行单独更新然后提交?
我的文件结构如下:
config.php
script
|--myscript.php
Run Code Online (Sandbox Code Playgroud)
myscript.php
<?php
require '../config.php';
?>
Run Code Online (Sandbox Code Playgroud)
执行时,php /path/to/myscript.php我得到Warning: require(../config.php): failed to open stream: No such file or directory.
什么原因?
我有一个像这样的嵌套循环:
while(1){
while($something){
break & continue;
}
// More stuff that I don't want to process in this situation
}
Run Code Online (Sandbox Code Playgroud)
我想突破第二个while循环并从头开始继续第一个循环(没有完成第一个循环).这可能不使用变量吗?
我最近将我的项目表切换到InnoDB(认为关系将是一件好事).我正在使用PHP脚本一次索引大约500个产品.
存储word/ids关联的表:
CREATE TABLE `windex` (
`word` varchar(64) NOT NULL,
`wid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`count` int(11) unsigned NOT NULL DEFAULT '1',
PRIMARY KEY (`wid`),
UNIQUE KEY `word` (`word`)
) ENGINE=InnoDB AUTO_INCREMENT=324551 DEFAULT CHARSET=latin1
Run Code Online (Sandbox Code Playgroud)
另一个表存储产品ID /字ID关联:
CREATE TABLE `indx_0` (
`wid` int(7) unsigned NOT NULL,
`pid` int(7) unsigned NOT NULL,
UNIQUE KEY `wid` (`wid`,`pid`),
KEY `pid` (`pid`),
CONSTRAINT `indx_0_ibfk_1` FOREIGN KEY (`wid`) REFERENCES `windex` (`wid`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `indx_0_ibfk_2` FOREIGN KEY (`pid`) REFERENCES `product` (`ID`) …Run Code Online (Sandbox Code Playgroud) 我有一张包含单词列表的表格.
字VARCHAR(16)
我需要创建一个反向索引.即.单词"apple"将索引为"elppa",单词"banana"作为"ananab"等等.
另外,是否有可能对该词的一部分进行索引?例如,跳过第一个/最后一个或两个字符:
pple(apple)anana(香蕉)
这些事情可能吗?
我有一个带有ISBN的MySQL MyISAM表.我想创建一个UNIQUE索引,如果值为空或null,则不会抛出"重复"错误.
这可能吗?
我有一个PHP脚本解析XML文件并创建一个大型SQL文件,如下所示:
INSERT IGNORE INTO table(field1,field2,field3...)
VALUES ("value1","value2",int1...),
("value1","value2",int1)...etc
Run Code Online (Sandbox Code Playgroud)
这个文件总计超过20GB(我已经在2.5GB文件上测试过,但它也失败了).
我尝试过如下命令:
mysql -u root -p table_name </var/www/bigfile.sql
这适用于较小的文件,比如大约50MB.但它不适用于较大的文件.
我试过了:
mysql> source /var/www/bigfile.sql
Run Code Online (Sandbox Code Playgroud)
我也试过mysqlimport,但是甚至不能正确处理我的文件.
我不断收到错误消息
ERROR 2006 (HY000): MySQL server has gone away
Run Code Online (Sandbox Code Playgroud)
发生约.我开始执行后30秒.
我将allowed_max_packet设置为4GB,但在使用SHOW VARIABLES进行验证时,它只显示1GB.
有没有办法做到这一点而不浪费另外10个小时?
我需要以下列方式调用函数:
var f = 'fadeOut';
$(v).f(s, function(){
$(v).css('visibility', 'hidden').css('position', 'absolute');
});
Run Code Online (Sandbox Code Playgroud)
这可以简单吗?
我有一张1700万行的表.我需要抓取该表的1列并将其全部插入到另一个表中.这是我做的:
INSERT IGNORE INTO table1(name) SELECT name FROM main WHERE ID < 500001
Run Code Online (Sandbox Code Playgroud)
InnoDB大约需要3分45秒
但是,MyISAM仅在4秒内执行.为什么不同?
我看到每个人都赞扬InnoDB但老实说我不知道它对我来说有多好.它慢得多.我知道它对于完整性和诸如此类的东西很有用,但我的许多表都不会被更新(只是阅读).我应该打扰InnoDB吗?
我有2个表table_a和table_b.
CREATE TABLE `table_a` (
`ID` int(11) unsigned NOT NULL AUTO_INCREMENT,
`val` varchar(64) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `val` (`val`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
CREATE TABLE `table_b` (
`ref_a` int(11) unsigned NOT NULL,
`data` int(11) unsigned NOT NULL,
UNIQUE KEY `unique_index` (`ref_a`,`data`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
Run Code Online (Sandbox Code Playgroud)
我想MASS INSERT到表B中,ref_a值指的是表A的ID.
这就是我想要完成的事情:
SELECT ID FROM table_a WHERE val = "123"
Run Code Online (Sandbox Code Playgroud)
如果该值不存在,则插入该值
INSERT INTO table_a(val) VALUES("123")
Run Code Online (Sandbox Code Playgroud)
现在我得到了ID(假设它是"1"),我想插入table_b:
INSERT INTO table_b(ref_a, data) VALUES(1, 75)
Run Code Online (Sandbox Code Playgroud)
当我想批量进行时,问题出现了.如果我在SELECTS和INSERTS之间交替而不是进行批量插入,那么我的表现是否会下降,然后批量选择?
我可以:
INSERT INTO table_b(ref_a, data) VALUES((SELECT ID …Run Code Online (Sandbox Code Playgroud) mysql ×7
php ×4
database ×2
indexing ×2
innodb ×2
apache ×1
javascript ×1
loops ×1
myisam ×1
mysqlimport ×1
nested-loops ×1
performance ×1
sql ×1