我曾经写过像sql一样的语句
select * from teacher where (TeacherID = @TeacherID) OR (@TeacherID = -1)
Run Code Online (Sandbox Code Playgroud)
并传递@TeacherID值= -1以选择所有教师
现在我担心你能告诉我的表现是一个好的练习还是坏的一个?
非常感谢
我知道这是非常广泛的,所以让我给你一个设置,并具体说明我的重点.
设置:
我正在使用MYSQL使用现有的PHP应用程序.几乎所有表都使用MYISAM引擎,并且大部分都包含数百万行.其中一个最大的表使用EAV设计,这是必要但对性能的影响.该应用程序是为了最好地利用MYSQL缓存而编写的.它每页加载请求相当数量的请求(部分原因是这样),并且复杂到足以在每次页面加载时通过整个数据库的大多数表.
优点:
缺点:
感觉需要在上升年度扩大规模,但不一定准备立即支付许可费用,我一直在考虑重写应用程序和切换数据库.
正在考虑的三个选项是继续使用mysql但使用INNODB引擎,这样我们可以利用更多的CPU功率.当我们需要向上扩展4Gb数据库,1Gb RAM或1 CPU限制(我们还没有达到目标)时,适应Oracle XE并获得许可证.或者适应PostgreSQL
所以问题是:
我认为这已经很多了,所以我会在这里停下来.如果有赞美的链接,我不介意简单/不完整的答案.
如果您需要更多信息,请告诉我
在此先感谢各位,感谢您的帮助.
我正在尝试为网站编写搜索功能,我已经决定使用MySQL临时表来处理数据输入的方法,通过以下查询:
CREATE TEMPORARY TABLE `patternmatch`
(`pattern` VARCHAR(".strlen($queryLengthHere)."))
INSERT INTO `patternmatch` VALUES ".$someValues
Run Code Online (Sandbox Code Playgroud)
$someValues具有布局的一组数据在哪里('some', 'search', 'query')- 或者基本上是用户搜索的数据.然后我images根据表中的数据搜索我的主表,patternmatch如下所示:
SELECT images.* FROM images JOIN patternmatch ON (images.name LIKE patternmatch.pattern)
Run Code Online (Sandbox Code Playgroud)
然后我根据每个结果与输入匹配的程度应用启发式或评分系统,并通过启发式等显示结果.
我想知道创建临时表需要多少开销?我知道它们只存在于会话中,并在会话结束后立即被删除,但如果我每秒有数十万次搜索,我会遇到什么样的性能问题?有没有更好的方法来实现搜索功能?
我可以看到DBA团队建议在性能优化时将序列缓存设置为更高的值.要将值从20增加到1000或5000. oracle docs表示缓存值,
Specify how many values of the sequence the database preallocates and keeps in memory for faster access.
在AWR报告的某处,我可以看到,
select SEQ_MY_SEQU_EMP_ID.nextval from dual
如果我增加缓存值,可以看到任何性能改进SEQ_MY_SEQU_EMP_ID.
我的问题是:
序列缓存是否在性能方面发挥了重要作用?如果是这样,如何知道序列所需的足够缓存值是多少.
我有这个过程,必须使用pl/pgsql进行一系列查询:
--process:
SELECT function1();
SELECT function2();
SELECT function3();
SELECT function4();
Run Code Online (Sandbox Code Playgroud)
为了能够在一次调用中执行所有操作,我创建了一个过程函数:
CREATE OR REPLACE FUNCTION process()
RETURNS text AS
$BODY$
BEGIN
PERFORM function1();
PERFORM function2();
PERFORM function3();
PERFORM function4();
RETURN 'process ended';
END;
$BODY$
LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)
问题是,当我总结每个函数自身所用的时间时,总计为200秒,而函数所process()用的时间超过一个小时!
也许这是一个内存问题,但我不知道postgresql.conf应该改变哪种配置.
DB在Debian 8中的PostgreSQL 9.4上运行.
postgresql plpgsql database-performance query-performance postgresql-performance
我从Marc Gravell(@MarcGravell)那里读到了这个答案:https://stackoverflow.com/a/47790712/5779732
最后一行说:
作为代码的次要优化:首选AsList()到ToList()以避免创建副本.
该陈述是关于QueryMultiple()哪些回报GridReader.
在我的理解中,System.Linq提供了一种扩展方法IEnumerable.ToList().以下是从微软约ToList().
ToList(IEnumerable)方法强制立即进行查询评估并返回包含查询结果的List.您可以将此方法附加到查询中,以获取查询结果的缓存副本.
IDbConnection.Query()将永远返回IEnumerable或null.在调用代码时可以轻松完成空检查.那么有什么区别AsList呢?
如果我的理解是正确的,AsList将始终在内部调用ToList哪个将创建副本.
考虑到这一点,是AsList()不是更好ToList()用IDbConnection.Query(),它返回IEnumerable?如是; 为什么?
AsList()在这种情况下,内部是什么使它成为更好的选择?
我有一个postgres表(让我们调用此表Events)与另一个表的复合外键(让我们调用此表Logs).Events表如下所示:
CREATE TABLE Events (
ColPrimary UUID,
ColA VARCHAR(50),
ColB VARCHAR(50),
ColC VARCHAR(50),
PRIMARY KEY (ColPrimary),
FOREIGN KEY (ColA, ColB, ColC) REFERENCES Logs(ColA, ColB, ColC)
);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我知道我可以通过主键有效地搜索事件,并加入到日志.
我感兴趣的是这个外键是否在Events表上创建了一个索引,即使没有加入也可以使用它.例如,以下查询是否会受益于FK?
SELECT * FROM Events
WHERE ColA='foo' AND ColB='bar'
Run Code Online (Sandbox Code Playgroud)
注意:我已经针对一个非常类似的情况运行了POSTGRES EXPLAIN,并且看到该查询将导致全表扫描.我不确定这是因为FK对此查询没有帮助,或者我的数据大小很小并且扫描在我当前的规模上更有效.
我有一个带有列c的表t,它是一个int并且在其上有一个btree索引.
为什么以下查询不使用此索引?
explain select c from t group by c;
Run Code Online (Sandbox Code Playgroud)
我得到的结果是:
HashAggregate (cost=1005817.55..1005817.71 rows=16 width=4)
-> Seq Scan on t (cost=0.00..946059.84 rows=23903084 width=4)
Run Code Online (Sandbox Code Playgroud)
我对索引的理解是有限的,但我认为这些查询是索引的目的.
database postgresql relational-database database-performance
所以我正在使用mongodb,我不确定我是否已经为我正在尝试做的事情获得了正确/最佳的数据库集合设计.
可以有许多项目,用户可以创建包含这些项目的新组.任何用户都可以关注任何组!

我没有将关注者和项目添加到组集合中,因为组中可能有5个项目,或者可能有10000个(对于关注者来说相同),并且从研究中我认为您不应该使用未绑定的数组(其中由于尺寸扩大而必须移动文档时由于性能问题而导致限制未知.(在遇到性能问题之前,是否有建议的阵列长度最大值?)
我认为使用以下设计时,真正的性能问题可能是当我想要获取用户为特定项目关注的所有组(基于user_id和item_id)时,因为我必须找到所有组用户正在关注,并从中查找具有group_id $ in和项ID的所有item_group.(但我实际上看不到任何其他方式这样做)
Follower
.find({ user_id: "54c93d61596b62c316134d2e" })
.exec(function (err, following) {
if (err) {throw err;};
var groups = [];
for(var i = 0; i<following.length; i++) {
groups.push(following[i].group_id)
}
item_groups.find({
'group_id': { $in: groups },
'item_id': '54ca9a2a6508ff7c9ecd7810'
})
.exec(function (err, groups) {
if (err) {throw err;};
res.json(groups);
});
})
Run Code Online (Sandbox Code Playgroud)
是否有更好的DB模式来处理这种类型的设置?
更新:在下面的评论中添加了示例用例.
任何帮助/建议将非常感谢.
非常感谢,Mac
javascript database-design mongodb database-performance database-schema
我注意到像 Postgres 这样的一些数据库添加了,Enum但问题是,
integer/string based enum会成为性能问题?下面这个回答关于Postgresql enum的差异有哪些优点和缺点?
因为当您使用 Rails 或在本例中使用EctoElixir 语言时,存在一定程度的抽象,因此列出的两个优点之一根本不会成为问题,因此只需要performance关注。
因此,当该优势确实很重要时,您就放弃了其中列出的劣势
postgresql ×5
performance ×3
database ×2
mysql ×2
oracle ×2
c# ×1
dapper ×1
enums ×1
filter ×1
javascript ×1
linq ×1
mongodb ×1
php ×1
plpgsql ×1
sql ×1
sql-server ×1
temp-tables ×1