我正在尝试设置一个脚本来测试开发mysql服务器上的查询性能.这里有更多细节:
SELECT ... LIKE '%xy%')我想要做的是创建可靠的测试环境来测量单个查询的速度,而不依赖于其他变量.
到现在我一直在使用SQL_NO_CACHE,但有时这些测试的结果也显示缓存行为-以更长的时间在第一次运行执行,并采取更少的时间在后续运行.
如果有人能够详细解释这种行为,我可能会坚持使用SQL_NO_CACHE; 我相信这可能是由于文件系统缓存和/或用于执行查询的索引的缓存,正如本文所解释的那样.当缓冲池和密钥缓冲区失效或者它们如何干扰测试时,我不清楚.
因此,如果没有重新启动mysql服务器,您会如何建议设置一个可靠的环境来确定一个查询是否比另一个更好?
如何从表中选择前n个最大值?
对于这样的表:
column1 column2
1 foo
2 foo
3 foo
4 foo
5 bar
6 bar
7 bar
8 bar
Run Code Online (Sandbox Code Playgroud)
对于n = 2,结果必须是:
3
4
7
8
Run Code Online (Sandbox Code Playgroud)
以下方法仅选择每个组的最大值.
SELECT max(column1) FROM table GROUP BY column2
Run Code Online (Sandbox Code Playgroud)
返回:
4
8
Run Code Online (Sandbox Code Playgroud) 阅读CJDate数据库系统简介或类似水平书籍的人不应该对标准化和非规范化的定义有问题.
然而,记忆不像过去那样,我发现自己经常看一些设计并说它没有正常化,即使我找不到它正在破坏的正常形式.
说明它的实际例子是:
如果我们有关系
r1 (A, B, C) 和 r2 (A, D)
与FD:AB-> C和A-> D.
并且r1表示详细数据,同时r2是该数据的摘要(换言之,D的每个实例是r1中的值的函数.在该示例中,使其为根据来自r1的A的值C的小计).
示例实例
r1 =
A B C
1 1 10
1 2 20
2 1 10
2 2 25
r2 =
A D
1 30
2 35
Run Code Online (Sandbox Code Playgroud)
所以,即使我不能说它打破例如2NF或3NF,我似乎仍然坚持认为设计仍然在以下意义上非规范化(来自Codd,EF"数据库关系模型的进一步规范化") ,第34页,评论超过1NF的正常化原因):
- 从不受欢迎的插入,更新和删除依赖项中释放关系集合;
- 随着新型数据的引入,减少重建关系集合的需要,从而延长应用程序的使用寿命;
- 使关系模型对用户更具信息性;
- 使查询统计中的关系集合中立,这些统计信息随着时间的推移可能会发生变化.
我可以说,如果我们将D定义为来自r1的所有C的总和,其中来自r1的A等于来自r2的A,那么,如果我们在r1中更新C并且我们不在r2中更新D,我们可以最终由于不合适的更新依赖性并且数据最终处于不一致状态,我发现这个原因是将r1和r2称为非规范化并将它们视为非规范化.(事实上,整个r2是r1的函数,并将零个新事实带入模型; r2 = f(r1))
所以问题是
注意:
对于那些发现有趣的问题并给出答案的人,我请求提供可引用的内容或以特定的假设和结论形式(或者换句话说,如果你要去在你看来,请用一些推理跟着它).
编辑 我接受了dportas的回答.我将在这里尝试添加一点:CJDate可以做出明确而严格的区分:
许多设计理论都与减少冗余有关; 规范化减少了relvars中的冗余,正交性减少了relvars中的冗余.
并在下一页
正如未能一直正常化意味着冗余并且可能导致某些异常,因此也不能坚持正交性.
我有一个文本字符串存储为BLOB数据库中的数据类型.我想通过SQL select查询提取它,但是我在转换/转换BLOB到可读时遇到问题text.
我试过例如
select convert(nvarchar(40),convert(varbinary(40),BLOBTextToExtract))
from [NavisionSQL$Customer]
Run Code Online (Sandbox Code Playgroud)
我想我需要类似的东西,但我无法弄清楚我需要做什么转换.有人可以给我一些指示吗?
问候
我有一张名为'出勤'的表格,用于记录学生在课程中的出勤时间.此表有4列,例如'id','course_id','attendance_time'和'student_name'.此表中的少数记录的示例是:
23 100 1/1/2010 10:00:00汤姆
24 100 1/1/2010 10:20:00鲍勃
25 187 1/2/2010 08:01:01丽莎
.....
我想创建每门课程最新出勤时间的摘要.我在下面创建了一个查询:
SELECT course_id, max(attendance_time) FROM attendance GROUP BY course_id
Run Code Online (Sandbox Code Playgroud)
结果将是这样的
100 1/1/2010 10:20:00
187 1/2/2010 08:01:01
现在,我想要做的就是在上面的结果中添加'id'列.怎么做?
我不能只是将命令改为这样的东西
SELECT id, course_id, max(attendance_time) FROM attendance GROUP BY id, course_id
Run Code Online (Sandbox Code Playgroud)
因为它会返回所有记录,就像没有使用聚合函数一样.请帮我.
将重构元组添加到列表的正确语法是什么?
例如,如果我有两个列表:
>>> a = [(1,2,3),(4,5,6)]
>>> b = [(0,0)]
Run Code Online (Sandbox Code Playgroud)
然后我希望以下工作:
>>> b.append((a[0][0],a[0,2]))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not tuple
Run Code Online (Sandbox Code Playgroud)
此外,当它告诉我索引必须是整数时,它是如何工作的?
>>> b.append((7,7))
>>> b
[(0, 0), (7, 7)]
Run Code Online (Sandbox Code Playgroud) 我遇到了一些性能问题,其中计算列平均值的SQL查询随着记录数量的增长而逐渐变慢.是否有可以添加到列的索引类型,以便更快地进行平均计算?
有问题的数据库是PostgreSQL,我知道特定的索引类型可能不可用,但我也对理论答案很感兴趣,天气甚至没有某种缓存解决方案.
更具体地说,有问题的数据本质上是一个具有这种定义的日志:
table log {
int duration
date time
string event
}
Run Code Online (Sandbox Code Playgroud)
我正在做类似的查询
SELECT average(duration) FROM log WHERE event = 'finished'; # gets average time to completion
SELECT average(duration) FROM log WHERE event = 'finished' and date > $yesterday; # average today
Run Code Online (Sandbox Code Playgroud)
第二个总是相当快,因为它具有更严格的WHERE子句,但总平均持续时间1是导致问题的查询类型.我知道我可以缓存这些值,使用OLAP或其他东西,我的问题是天气有一种方法我可以完全通过数据库方面的优化,如索引来做到这一点.
SELECT count(*)
FROM contacts_lists
JOIN plain_contacts
ON contacts_lists.contact_id = plain_contacts.contact_id
JOIN contacts
ON contacts.id = plain_contacts.contact_id
WHERE plain_contacts.has_email
AND NOT contacts.email_bad
AND NOT contacts.email_unsub
AND contacts_lists.list_id =67339
Run Code Online (Sandbox Code Playgroud)
我怎样才能优化这个查询..请你解释一下......
我最终在我们的一个mysql列中搞乱了字符编码.
通常我有
√©而不是
é√∂而不是ö√
≠而不是í
等等...
相当确定这里有人会知道发生了什么以及如何解决.
更新: 基于bobince的答案,因为我在文件中有这些数据,所以我做了以下操作
#!/user/bin/env python
import codecs
f = codecs.open('./file.csv', 'r', 'utf-8')
f2 = codecs.open('./file-fixed.csv', 'w', 'utf-8')
for line in f:
f2.write(line.encode('macroman').decode('utf-8')),
Run Code Online (Sandbox Code Playgroud)
之后
load data infile 'file-fixed.csv'
into table list1
fields terminated by ','
optionally enclosed by '"'
ignore 1 lines;
Run Code Online (Sandbox Code Playgroud)
正确导入数据.
UPDATE2: Hammerite,只是为了完整性,这里是要求的细节......
mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | …Run Code Online (Sandbox Code Playgroud) mysql ×3
sql ×3
performance ×2
postgresql ×2
aggregate ×1
blob ×1
dynamics-nav ×1
list ×1
mojibake ×1
python ×1
relational ×1
sql-server ×1
testing ×1
theory ×1
tuples ×1