在注意到我们的数据库已成为我们的实时生产系统的主要瓶颈后,我决定构建一个简单的基准来解决问题的根源.
基准测试:我计算在InnoDB表中增加相同行3000次所需的时间,其中行由其主键索引,并且正在更新的列不是任何索引的一部分.我使用在远程计算机上运行的20个并发客户端执行这3000次更新,每个客户端都有自己与数据库的单独连接.
我有兴趣了解为什么我对基准测试的不同存储引擎InnoDB,MyISAM和MEMORY拥有他们所做的配置文件.我也希望明白为什么InnoDB相比之差很大.
InnoDB(20个并发客户端):每次更新需要0.175秒.所有更新都在6.68s之后完成.
MyISAM(20个并发客户端):每次更新需要0.003秒.所有更新都在0.85秒后完成.
内存(20个并发客户端):每次更新需要0.0019秒.所有更新都在0.80秒后完成.
考虑到并发可能导致此行为,我还对单个客户端进行基准测试,并按顺序执行100次更新.
InnoDB:每次更新需要0.0026秒.
MyISAM:每次更新需要0.0006秒.
内存:每次更新需要0.0005秒.
实际的机器是Amazon RDS实例(http://aws.amazon.com/rds/),主要是默认配置.
我猜测答案将沿着以下几行:每次更新后InnoDB fsyncs(因为每次更新都是符合ACID的事务),而MyISAM则没有,因为它甚至不支持事务.MyISAM可能正在内存中执行所有更新,并定期刷新到磁盘,这是它的速度接近MEMORY存储引擎的方式.如果是这样,有没有办法使用InnoDB进行事务支持,但是可能会放松一些约束(通过配置),以便以一些持久性为代价更快地完成写入?
此外,任何有关如何提高InnoDB的性能的建议随着客户数量的增加而增加?它显然比其他存储引擎更糟糕.
更新
我找到了https://blogs.oracle.com/MySQL/entry/comparing_innodb_to_myisam_performance,这正是我想要的.设置innodb-flush-log-at-trx-commit = 2允许我们在出现电源故障或服务器崩溃的情况下放松ACID约束(每秒刷新一次磁盘).这给了我们与MyISAM类似的行为,但我们仍然可以从InnoDB中提供的事务功能中受益.
运行相同的基准测试,我们发现写入性能提高了10倍.
InnoDB(20个并发客户端):每次更新需要0.017秒.所有更新都在0.98秒后完成.
还有其他建议吗?
嗨,我有这个大型的oracle hibernate Web应用程序,它似乎给出了这个错误
ORA-01795: maximum number of expressions in a list is 1000
我需要一个由某人测试的java代码作为一个hibernate用户定义的组件,在我的屏幕中添加到我的搜索java类,尽可能容易有人有这样的测试组件?
所以我对慢查询日志的理解是,它记录了我们在my.conf文件中设置的> = time(以秒为单位)的所有查询的信息.
现在让我们来看3个不同的SELECT查询3个案例(针对具有INNODB引擎的表):
QUERY I: Query_time:32.937667 Lock_time:0.000081 Rows_sent:343 Rows_examined: 12714043
QUERY II: Query_time:12.937667 Lock_time:0.000081 Rows_sent:43 Rows_examined: 714043
QUERY III: Query_time:42.937667 Lock_time:0.000081 Rows_sent:18 Rows_examined: 483
对我来说,QUERY I和QUERY II看起来像是一个糟糕的查询或糟糕的索引(或缺少索引)或碎片化的表数据等(我可能错过的任何其他东西?)用户可能会看到以改善查询执行时间的可能情况.
但是对于QUERY III,我无法理解,我的意思是数据库真正错误的是它需要42秒才能检查483行并发送回其中的18行(锁定时间可忽略不计).当我看到它间歇性地发生时,这变得更加混乱.
所以我真正想问的是:
可能有很多因素影响这种慢查询,所以如果你觉得你需要更多的信息来帮助我,那么请告诉我.
我在本地安装了InnoDB的MySQL 5.5.37和Ubuntu 13.10上的apt-get.我的机器是台式机上的i7-3770 + 32Gb内存+ SSD硬盘.对于仅包含150万条记录的表"mytable",以下DDL查询需要超过20分钟(!):
ALTER TABLE mytable ADD some_column CHAR(1) NOT NULL DEFAULT 'N';
Run Code Online (Sandbox Code Playgroud)
有没有办法改善它?我检查了
show processlist;
Run Code Online (Sandbox Code Playgroud)
它显示它出于某种原因正在复制我的表格.令人不安的是令人不安的.有没有办法关掉这个副本?是否有其他方法可以提高向大表添加列的性能?
除此之外,我的数据库相对较小,只有1.3Gb转储大小.因此它(理论上)应该100%适合记忆.
有设置可以帮助吗?迁移到Precona会改变一切吗?
补充:我有
innodb_buffer_pool_size = 134217728
Run Code Online (Sandbox Code Playgroud) 摘要:由于性能和可维护性问题,我已经看到很多反对在MS SQL 中使用SELECT*的建议.然而,这些帖子很多都很老 - 5到10年!它似乎是,许多这些职位的,其性能的担忧可能实际上已经相当小,甚至在自己的时间,并作为可维护性关注("哦,不,如果有人改变了列,并且被索引获取数据一个数组!你的SELECT*会让你遇到麻烦!"),现代编码实践和ORM(如Dapper)似乎 - 至少在我的经验中 - 消除了这些问题.
所以:SELECT*是否存在今天仍然存在的问题?
更大的背景:我已经开始在一个有很多旧MS代码(ASP脚本等)的地方工作,但我一直在帮助实现大量现代化,但是:我的大部分SQL经验实际上来自于MySQL和PHP框架和ORM - 这是我第一次使用MS SQL - 我知道两者之间存在细微差别.另外:我的同事比我年长一点,并且有一些担忧 - 对我来说 - 似乎"老了".("可空的字段很慢!避免它们!")但是又一次:在这个特定的领域,他们肯定比我有更多的经验.
出于这个原因,我还想问一下:现代ORM中的SELECT*是否安全无瑕,是否有安全和明智的做法,是否有最新的在线资源表明这样?
谢谢!:)
我刚才开始使用dapper.net是出于性能原因而且我真的喜欢命名参数功能,而不是在LINQ To SQL中运行"ExecuteQuery".
它适用于大多数查询,但我不时会得到一些非常奇怪的超时.最奇怪的是,只有在通过dapper执行SQL时才会发生此超时.如果我从分析器中复制执行的查询并在Management Studio中运行它的速度很快,并且工作正常.而且这不仅仅是暂时的问题.查询始终通过dapper超时,并在Management Studio中始终正常工作.
exec sp_executesql N'SELECT Item.Name,dbo.PlatformTextAndUrlName(Item.ItemId) As PlatformString,dbo.MetaString(Item.ItemId) As MetaTagString, Item.StartPageRank,Item.ItemRecentViewCount
NAME_SRCH.RANK as NameRank,
DESC_SRCH.RANK As DescRank,
ALIAS_SRCH.RANK as AliasRank,
Item.itemrecentviewcount,
(COALESCE(ALIAS_SRCH.RANK, 0)) + (COALESCE(NAME_SRCH.RANK, 0)) + (COALESCE(DESC_SRCH.RANK, 0) / 20) + Item.itemrecentviewcount / 4 + ((CASE WHEN altrank > 60 THEN 60 ELSE altrank END) * 4) As SuperRank
FROM dbo.Item
INNER JOIN dbo.License on Item.LicenseId = License.LicenseId
LEFT JOIN dbo.Icon on Item.ItemId = Icon.ItemId
LEFT OUTER JOIN FREETEXTTABLE(dbo.Item, name, @SearchString) NAME_SRCH ON
Item.ItemId = …Run Code Online (Sandbox Code Playgroud) 我需要对与黄金页面有点类似的东西实现分类和子分类.
假设我有下表:
CategoryId, Title
10, Home
20, Business
30, Hobbies
Run Code Online (Sandbox Code Playgroud)
我有两个选项来编码子分类.
CategoryId, SubCategoryId, Title
10, 100, Gardening
10, 110, Kitchen
10, 120, ...
20, 100, Development
20, 110, Marketing
20, 120, ...
30, 100, Soccer
30, 110, Reading
30, 120, ...
Run Code Online (Sandbox Code Playgroud)
CategoryId, SubCategoryId, Title
10, 100, Gardening
10, 110, Kitchen
10, 120, ...
20, 130, Development
20, 140, Marketing
20, 150, ...
30, 160, Soccer
30, 170, Reading
30, 180, ... …Run Code Online (Sandbox Code Playgroud) 假设我在中午12点运行一个非常昂贵的查询.如果在12:01,我打开SQL Server活动监视器并查看最近的昂贵查询,我想我会在那里看到它.12:10怎么样?12:30?下午5点?该查询何时会从视图中消失?
与每分钟执行列一样,找到该值的平均时间是多少,以及更新的频率是多少?
我知道如果您在概览选项卡中右键单击,您可以设置"刷新间隔",但这不一定与分析数据的时间段相同.进程和资源等待只是一个快照.但"最近的昂贵查询"是最近x分钟的汇总数据.
我的问题是如何找到x设置的内容?
我知道这是非常广泛的,所以让我给你一个设置,并具体说明我的重点.
设置:
我正在使用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)
然后我根据每个结果与输入匹配的程度应用启发式或评分系统,并通过启发式等显示结果.
我想知道创建临时表需要多少开销?我知道它们只存在于会话中,并在会话结束后立即被删除,但如果我每秒有数十万次搜索,我会遇到什么样的性能问题?有没有更好的方法来实现搜索功能?
mysql ×5
sql-server ×3
performance ×2
sql ×2
categories ×1
dapper ×1
database ×1
ddl ×1
hibernate ×1
innodb ×1
java ×1
myisam ×1
oracle ×1
orm ×1
php ×1
postgresql ×1
temp-tables ×1