这个网站上已经存在很多性能问题,但是我发现几乎所有这些都是特定于问题且相当狭窄的问题.几乎所有人都重复这些建议,以避免过早优化.
我们假设:
我在这里寻找的是在一个关键算法中挤出最后几个百分点的策略和技巧,除此之外别无他法.
理想情况下,尝试使答案语言不可知,并在适用的情况下指出建议策略的任何缺点.
我将使用我自己的初步建议添加回复,并期待Stack Overflow社区可以想到的任何其他内容.
我现在有一些查询耗时太长(300毫秒),因为数据库已经增长到几百万条记录.幸运的是,对我来说,查询不需要查看大部分数据,最新的100,000条记录就足够了,所以我的计划是维护一个包含最新100,000条记录的单独表格并针对此运行查询.如果有人对更好的方法有任何建议,这将是伟大的.我真正的问题是,如果查询确实需要针对历史数据运行,有哪些选项,下一步是什么?我想到的事情:
这些事情是否正确,还有其他选择吗?某些数据库提供程序是否具有比其他数据库提供程序更多的功能来处理这些问题,例如将特定的表/索引指定为完全在内存中?
对不起,我应该提到这个,我正在使用mysql.
我忘了在上面提到索引.到目前为止,索引是我唯一的改进来源.为了识别瓶颈,我一直在使用maatkit进行查询,以显示是否正在使用索引.
我知道我现在正在远离问题的目的,所以也许我应该再做一个.我的问题是EXPLAIN说查询需要10毫秒而不是300毫秒jprofiler报告.如果有人有任何建议我会非常感激.查询是:
select bv.*
from BerthVisit bv
inner join BerthVisitChainLinks on bv.berthVisitID = BerthVisitChainLinks.berthVisitID
inner join BerthVisitChain on BerthVisitChainLinks.berthVisitChainID = BerthVisitChain.berthVisitChainID
inner join BerthJourneyChains on BerthVisitChain.berthVisitChainID = BerthJourneyChains.berthVisitChainID
inner join BerthJourney on BerthJourneyChains.berthJourneyID = BerthJourney.berthJourneyID
inner join TDObjectBerthJourneyMap on BerthJourney.berthJourneyID = TDObjectBerthJourneyMap.berthJourneyID
inner join TDObject on TDObjectBerthJourneyMap.tdObjectID = TDObject.tdObjectID
where
BerthJourney.journeyType='A' and
bv.berthID=251860 and
TDObject.headcode='2L32' and
bv.depTime is null and
bv.arrTime > '2011-07-28 16:00:00'
Run Code Online (Sandbox Code Playgroud)
而输出来自EXPLAIN:
+----+-------------+-------------------------+-------------+---------------------------------------------+-------------------------+---------+------------------------------------------------+------+-------------------------------------------------------+
| id | select_type …Run Code Online (Sandbox Code Playgroud) Raymond Chen在他最近关于代码优化的帖子中有这样的说法......明显的优化 - 一个需要优化的优化 - 如果考虑所有需要考虑的话,往往会"去优化"...
在您了解更多信息后,我确信您必须遇到/甚至编码优化您感到尴尬...
小心分享?
我有一个汽车分类列表数据库.
90天后,分类列表不再有效显示(列表过期); 但是,我想保留列表以便存档.
问题:从数据库设计最佳实践角度以及查询性能来看,最好将旧的列表A)与当前列表保持在同一个表中,或者B),将过期的列表移到过期的表中并删除该列表从目前的上市表?
换一种说法,
选项A):
table_classified_listing:
car_id
expired = true | false
...
Run Code Online (Sandbox Code Playgroud)
选项B):
// only current listing in this table (expired = false)
table_classified_listing:
car_id
...
// only expired listing in this table (expired = true)
expired_table_classified_listing:
car_id
...
Run Code Online (Sandbox Code Playgroud)
更新:
我对选项A的关注是,在我的MySQL数据库中 - 当我运行时EXPLAIN,它说它正在使用expired作为索引的主键.但是,对我的查询搜索性能更重要的是它使用该price字段,因为我正在进行基于的搜索price > X.因此我为什么考虑选择选项B.
我正在尝试找出最好的方法来搜索"Tracklet"类型的向量(我自己构建的一个类)来查找其变量之一的给定值的第一个和最后一个出现.例如,我有以下类(本例简化):
class Tracklet {
TimePoint *start;
TimePoint *end;
int angle;
public:
Tracklet(CvPoint*, CvPoint*, int, int);
}
class TimePoint {
int x, y, t;
public:
TimePoint(int, int, int);
TimePoint(CvPoint*, int);
// Relevant getters and setters exist here
};
Run Code Online (Sandbox Code Playgroud)
我有一个向量" vector<Tracklet> tracklets",我需要搜索结束时间点给定值为"t"的任何tracklet.矢量按结束时间(即tracklet.end->t)排序.
我很乐意编写一个搜索算法,但我不确定采用哪种路由.我不确定二进制搜索是否合适,因为我似乎记得它不一定会找到第一个.我正在考虑一种方法,我使用二进制搜索来找到具有正确时间的元素的索引,然后迭代返回以找到第一个和前进以找到最后一个.我确信有更好的方法,因为它通过迭代浪费二进制搜索O(log n).
希望这是有道理的:我努力解释一下!干杯!
typedef unsigned char uChar;
typedef signed char sChar;
typedef unsigned short uShort;
typedef signed short sShort;
typedef unsigned int uInt;
typedef signed int sInt;
typedef unsigned long uLong;
typedef signed long sLong;
Run Code Online (Sandbox Code Playgroud)
我有一个typedef列表所以当我定义变量时,我可以准确.例如,如果我只需要数字0-5,我就会使用uChar.但我正在使用C++并正在制作引擎.我正在阅读关于.NET占用X字节的布尔值,并且由于内存对齐,它使用整数更快.
由于内存对齐,性能等原因,是否有理由使用int而不是uChar?
我有一个关于在java中创建新对象的问题.
让我们说我有方法叫: foo(String[] a)
我想传递给foo一个新String[]的只有一个用途的东西更好
表现1或2
1.
String[] a = new String[]{"a"};
foo(a);
Run Code Online (Sandbox Code Playgroud)
2.
foo(new String[]{"a"});
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助