我正在使用它从数据库中检索信息,查询总是会带来错误
这是我的查询:
SELECT * FROM users ORDER BY RAND() LIMIT '10'
Run Code Online (Sandbox Code Playgroud)
它总是在任一带来了错误ORDER BY RAND()
或LIMIT '10'
.
出现这种情况的原因是什么?还有什么解决方案吗?
什么是MySQL的语句更改row_format
到dynamic
?
我不确定我应该怎么做(即使用information_schema
或使用表格ALTER
).
经过大量的工作,我终于得到了一个相当复杂的查询,非常流畅地工作,并很快返回结果.
它在开发和测试方面运行良好,但现在测试速度已大大减慢.解释查询在开发上需要0.06秒并且在测试中大致相同,现在测试时间为7秒.
解释略有不同,我不确定为什么这将是dev的解释
-+---------+------------------------------+------+------------------------------ ---+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+------------+--------+-------------------------+------------ -+---------+------------------------------+------+------------------------------ ---+ | 1 | PRIMARY | | ALL | NULL | NULL | NULL | NULL | 5 | | | 1 | PRIMARY | tickets | ref | biddate_idx | biddate_idx | 7 | showsdate.bid,showsdate.date | 78 | | | 2 | DERIVED | shows | ALL | biddate_idx,latlong_idx | NULL …
我的查询:
EXPLAIN EXTENDED SELECT `artwork`.`id` , `artwork`.`added`
FROM `artwork`
ORDER BY `artwork`.`added` DESC
LIMIT 0 , 6
Run Code Online (Sandbox Code Playgroud)
当我在"添加"上添加索引以避免使用filesort
和使用index
而不是解释的输出来自
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE artwork ALL NULL NULL NULL NULL 302 100.00 Using filesort
Run Code Online (Sandbox Code Playgroud)
至
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE artwork index NULL added 4 NULL 6 5033.33
Run Code Online (Sandbox Code Playgroud)
而且我担心过滤的上升大约是4,100 - 我在Google上找不到什么filtered
意思
我有以下场景:在MySQL数据库中,我有2个MyISAM表,一个有420万行,另一个有3.2亿行.以下是表的架构:
表1(4.2M行)
F1 INTEGER UNSIGNED NOT NULL PRIMARY KEY
f2 varchar(40)
f3 varchar(40)
f4 varchar(40)
f5 varchar(40)
f6 smallint(6)
f7 smallint(6)
f8 varchar(40)
f9 varchar(40)
f10 smallint(6)
f11 varchar(10)
f12 tinyint(4)
f13 smallint(6)
f14 text
Run Code Online (Sandbox Code Playgroud)
表2(320M行)
F1 INTEGER UNSIGNED NOT NULL PRIMARY KEY
f2 INTEGER UNSIGNED NOT NULL
Run Code Online (Sandbox Code Playgroud)
表2位于不同的数据库中,但我使用的是查询这两个表的存储过程.两个表之间的关系是Table1.F1可能最多约.Table2.F1(外键)中的100行匹配,并且将为这些匹配的键返回Table2.f2的值.我在表1上有一个索引IX1(f2(15),f3(10))和表2中的索引IX2(F1,f2)和IX3(f2)
我正在运行的查询如下:
SELECT g.F1
FROM DB1.Table1 g
INNER JOIN DB2.Table2 gp ON g.F1 = gp.F1
WHERE (gp.f2 = 452677825) AND
(g.f2 = 'A string value') LIMIT 0,56
Run Code Online (Sandbox Code Playgroud)
此查询有时非常快(<1s),但更改g.F2所比较的字符串值会导致查询甚至超过11秒甚至30秒.我不明白为什么会这样.以下是执行SELECT的EXPLAIN的输出.
1, 'SIMPLE', 'g', 'ref', …
Run Code Online (Sandbox Code Playgroud) 请考虑以下查询:
SELECT * FROM Transactions
WHERE day(Stamp - interval 3 hour) = 1;
Run Code Online (Sandbox Code Playgroud)
Transactions表中的Stamp列是TIMESTAMP,并且有一个索引.我怎样才能更改此查询以避免全表扫描?(即在day()函数之外使用Stamp)
谢谢!
我有一张这样的桌子
CREATE TABLE IF NOT EXISTS `tbl_folder` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`owner_userid` int(11) NOT NULL,
`name` varchar(63) NOT NULL,
`description` text NOT NULL,
`visibility` tinyint(4) NOT NULL DEFAULT '2',
`num_items` int(11) NOT NULL DEFAULT '0',
`num_subscribers` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `owner_userid` (`owner_userid`),
KEY `vis_sub_item` (`visibility`,`num_subscribers`,`num_items`)
) ENGINE=InnoDB
Run Code Online (Sandbox Code Playgroud)
因为我有一个可见性索引,num_subscribers和num_items,我希望只需要查看前15行,而EXPLAIN说55856行.任何的想法?谢谢
EXPLAIN SELECT t.id, name, description, owner_userid, num_items, num_subscribers
FROM `tbl_folder` `t`
WHERE visibility =2
ORDER BY `t`.`num_subscribers` DESC , `t`.`num_items` DESC
LIMIT 15
id select_type …
Run Code Online (Sandbox Code Playgroud) mysql indexing sql-order-by compound-index sql-execution-plan
当你SELECT
在幕后处理一个通过phpmyadmin时,它有时会添加一个LIMIT 0,30
,和/或它会抛出一个SQL_CALC_FOUND_ROWS
,SELECT
所以它可以告诉我有多少结果没有LIMIT
.
不幸的是,添加SQL_CALC_FOUND_ROWS
有时需要的处理比我预期的要多得多(例如,比我运行原始的无问题查询更多).
是否有全局配置选项来禁用phpmyadmin对我的查询的修改?
我可以在每个查询的基础上使用哪些技巧来阻止phpmyadmin的修改?
我试图用mysql进行全文搜索,以匹配字符串.问题在于它首先返回了奇怪的结果.
例如,字符串'passat 2.0 tdi':
AND MATCH (
records_veiculos.titulo, records_veiculos.descricao
)
AGAINST (
'passat 2.0 tdi' WITH QUERY EXPANSION
)
Run Code Online (Sandbox Code Playgroud)
作为第一个结果返回这个(其他人都很好):
Volkswagen Passat Variant 1.9 TDI- ANO 2003
Run Code Online (Sandbox Code Playgroud)
这是不正确的,因为在这个例子中没有"2.0".
会是什么呢?
编辑:此外,由于这可能是一个大型数据库(期望高达500.000条记录),这种搜索方法是否最适合自己,或者安装任何其他搜索引擎如Sphinx会更好吗?或者如果没有,如何显示相关结果?
edit2:对于记录,尽管问题被标记为已回答,但MySQL分隔符的问题仍然存在,因此如果有人对如何逃避分隔符有任何建议,那么将会受到赞赏并且值得获得500分.我发现增加结果集的sollution是用IN BOOLEAN MODE替换WITH QUERY EXPANSION,使用运算符强制引擎得到我需要的单词,如:
AND MATCH (
records_veiculos.titulo, records_veiculos.descricao
)
AGAINST (
'+passat +2.0 +tdi' IN BOOLEAN MODE
)
Run Code Online (Sandbox Code Playgroud)
它根本没有解决,但至少结果的相关性发生了显着变化.
我在MySQL中有一个用于实时聊天的MEMORY表(也许这不是为此的最佳表类型?),并且每晚删除行以使聊天日志可管理,从而导致表开销。但是,由于您无法在MEMORY表上运行OPTIMIZE,如何摆脱开销(Data_free
在中show table status
)?
mysql ×10
join ×2
indexing ×1
limit ×1
match ×1
memory ×1
overhead ×1
performance ×1
phpmyadmin ×1
random ×1
sql ×1
sql-order-by ×1