从相当大的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_idsSELECTIN
这是多么高效?
这是"依赖"的情况吗?或者是否有一个具体的"这是(不)可接受的"或"快速"或"慢"或者我应该添加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