从相当大的SQL Server
表中删除重复行的最佳方法是什么(即300,000多行)?
当然,由于RowID
身份字段的存在,行不会是完美的重复.
MyTable的
RowID int not null identity(1,1) primary key,
Col1 varchar(20) not null,
Col2 varchar(2048) not null,
Col3 tinyint not null
Run Code Online (Sandbox Code Playgroud) 假设我有表student
,club
以及student_club
:
student {
id
name
}
club {
id
name
}
student_club {
student_id
club_id
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何找到足球(30)和棒球(50)俱乐部的所有学生.
虽然这个查询不起作用,但它是我迄今为止最接近的事情:
SELECT student.*
FROM student
INNER JOIN student_club sc ON student.id = sc.student_id
LEFT JOIN club c ON c.id = sc.club_id
WHERE c.id = 30 AND c.id = 50
Run Code Online (Sandbox Code Playgroud) 我最近一直在试验Redis和MongoDB,看起来通常情况下你会在MongoDB或Redis中存储一组id.因为我在询问MySQL IN运算符,所以我会坚持使用Redis来解决这个问题.
我想知道在IN运算符中列出大量(300-3000)id的性能如何,看起来像这样:
SELECT id, name, price
FROM products
WHERE id IN (1, 2, 3, 4, ...... 3000)
Run Code Online (Sandbox Code Playgroud)
想象一下像产品和类别表这样简单的东西,你通常可以将它们加在一起以获得某个类别的产品.在上面的示例中,您可以看到在Redis()中的给定类别下,我返回ID为4的类别中的所有产品ID,并将它们放在运算符内的上述查询中.category:4:product_ids
SELECT
IN
这是多么高效?
这是"依赖"的情况吗?或者是否有一个具体的"这是(不)可接受的"或"快速"或"慢"或者我应该添加LIMIT 25
,还是没有帮助?
SELECT id, name, price
FROM products
WHERE id IN (1, 2, 3, 4, ...... 3000)
LIMIT 25
Run Code Online (Sandbox Code Playgroud)
或者我应该修剪Redis返回的产品ID数组,将其限制为25,并且只将25个id添加到查询而不是3000并且LIMIT
从查询内部将其添加到25?
SELECT id, name, price
FROM products
WHERE id IN (1, 2, 3, 4, ...... 25)
Run Code Online (Sandbox Code Playgroud)
任何建议/反馈非常感谢!
我有一个MySQL查询(Ubu 10.04,Innodb,Core i7,16Gb RAM,SSD驱动器,MySQL params优化):
SELECT
COUNT(DISTINCT subscriberid)
FROM
em_link_data
WHERE
linkid in (SELECT l.id FROM em_link l WHERE l.campaignid = '2900' AND l.link != 'open')
Run Code Online (Sandbox Code Playgroud)
表em_link_data有大约7百万行,em_link有几千行.此查询大约需要18秒才能完成.但是,如果我替换子查询的结果并执行此操作:
SELECT
COUNT(DISTINCT subscriberid)
FROM
em_link_data
WHERE
linkid in (24899,24900,24901,24902);
Run Code Online (Sandbox Code Playgroud)
那么查询将在不到1毫秒的时间内运行.子查询单独运行不到1毫秒,列linkid被索引.
如果我将查询重写为连接,也不到1毫秒.为什么"IN"查询的子查询速度如此之慢以及为什么这么快的值?我无法重写查询(购买软件)所以我希望有一些调整或提示来加速这个查询!任何帮助表示赞赏.
我有一些表格,我收到电子邮件.而且我不想在桌面上收到电子邮件tbl_unsubscribe
.我写的查询如下:
SELECT cand_email FROM tbl_cand_data
UNION
SELECT emp_email FROM tbl_emp_data
UNION
SELECT email FROM tbl_uptade_list
UNION
SELECT feed_email FROM tbl_feedback
UNION
SELECT admin_email FROM tbl_admin_emails
Run Code Online (Sandbox Code Playgroud)
但我收到语法错误.是MINUS
运营商无效为MySQL?
更新:
只是在更加明显的地方提及它.当我将IN更改为=时,查询执行时间从180下降到0.00008秒.可笑的速度差异.
此SQL查询需要180秒才能完成!怎么可能?有没有办法优化它更快?
SELECT IdLawVersionValidFrom
FROM question_law_version
WHERE IdQuestionLawVersion IN
(
SELECT MAX(IdQuestionLawVersion)
FROM question_law_version
WHERE IdQuestionLaw IN
(
SELECT MIN(IdQuestionLaw)
FROM question_law
WHERE IdQuestion=236 AND IdQuestionLaw>63
)
)
Run Code Online (Sandbox Code Playgroud)
每个表中只有大约5000行,所以它不应该这么慢.
我可以为这些查询得到相同的结果,但哪一个是最快,最有效的?
在()或内部连接的位置?
SELECT `stats`.`userid`,`stats`.`sumpoint`
FROM `stats`
INNER JOIN users
ON `stats`.`userid` = `users`.`userid`
WHERE `users`.`nick` = '$nick'
ORDER BY `statoylar`.`sumpoint` DESC limit 0,10
Run Code Online (Sandbox Code Playgroud)
和
SELECT `stats`.`userid`,`stats`.`sumpoint`
FROM `stats`
WHERE userid
IN (
SELECT userid
FROM `users`
WHERE `users`.`nick` = '$nick'
)
ORDER BY `stats`.`sumpoint` DESC limit 0,10
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试构建一个有点棘手的MySQL Select语句.这是我想要完成的:
我有这样一张桌子:
data_table
uniqueID stringID subject
1 144 "My Subject"
2 144 "My Subject - New"
3 144 "My Subject - Newest"
4 211 "Some other column"
Run Code Online (Sandbox Code Playgroud)
基本上,我想要做的是能够SELECT/GROUP BY stringID(stringID是线程化的图片)而不是重复.此外,我想选择最近的stringID行(在上面的例子中是uniqueID 3).
因此,如果我要查询数据库,它将返回以下内容(最新的uniqueID位于顶部):
uniqueID stringID subject
4 211 "Some other column"
3 144 "My Subject - Newest" //Notice this is the most recent and distinct stringID row, with the proper subject column.
Run Code Online (Sandbox Code Playgroud)
我希望这是有道理的.谢谢你的帮助.
我有一个MySQL表.我们称之为小部件.Widget表有3个字段:id,type_id和name.在一个查询中,我希望获得与名为"doodad"的Widget 共享type_id的所有小部件.我写了2个查询:
这有效.每个查询,独立地实现其目标.
但是当我将它们组合成一个嵌套查询时,它会永远运行,无限循环样式.它看起来像这样:
SELECT * FROM widgets WHERE type_id IN (
SELECT type_id FROM widgets WHERE name = 'doodad'
);
Run Code Online (Sandbox Code Playgroud)
有谁能解释一下?是因为我正在编写一个在同一个表上运行两次的嵌套查询吗?
小轮子,为什么你要旋转?
mysql ×9
sql ×5
select ×2
duplicates ×1
inner-join ×1
nested ×1
operators ×1
performance ×1
php ×1
postgresql ×1
sql-server ×1
t-sql ×1