我的数据库有大约 30M 记录,集合大小约为 100GB(总文档和索引)。
\n\n我有一个复合索引,可以根据 user_id 和其他一些字段(例如:is_active
、is_logged_in
等)过滤数据。
我发现MongoDB Compass
查询速度很慢,大约需要 10 秒、20 秒甚至 40 秒!我运行了完全相同的查询,并且在不到 500 毫秒的时间内获取结果(尽管它可能会在第二次尝试时被缓存)。
当我获得该持续统计op
数据时,我会看到以下锁定状态:
"lockStats": {\n "Global": {\n "acquireCount": {\n "r": 574\n }\n },\n "MMAPV1Journal": {\n "acquireCount": {\n "r": 295\n },\n "acquireWaitCount": {\n "r": 2\n },\n "timeAcquiringMicros": {\n "r": 15494\n }\n },\n }\n
Run Code Online (Sandbox Code Playgroud)\n\nacquireCount
:与具有以下状态的快速查询(在另一个集合上)相比,操作在指定模式下获取锁的次数如此之高:
"lockStats": {\n "Global": {\n "acquireCount": {\n "r": 2\n }\n },\n "MMAPV1Journal": {\n "acquireCount": {\n "r": 1\n }\n },\n …
Run Code Online (Sandbox Code Playgroud) 我已经MongoDB
通过可选的 SSL 连接启用了 SSL :preferred
.
我曾经lets encrypt
为了获取SSL证书而使用过。SSLs 按预期工作,在mongod.log
文件中我可以看到:
2018-06-02T06:46:26.664+0000 I NETWORK [listener] connection accepted from MY_SERVER_IP:45442 #2953818 (121 connections now open)
2018-06-02T06:46:26.664+0000 I NETWORK [conn2953818] SSL mode is set to 'preferred' and connection 2953818 to MY_SERVER_IP:45442 is not using SSL.
Run Code Online (Sandbox Code Playgroud)
现在在同一台主机上,我尝试使用如下 mongo 客户端命令连接到 mongo:
mongo --ssl --host mongo.example.com --sslPEMKeyFile /etc/ssl/mongo.pem --sslCAFile /etc/ssl/ca.pem
Run Code Online (Sandbox Code Playgroud)
当我使用SSL
mongo 时出现错误:
MongoDB shell version v3.6.2
connecting to: mongodb://mongo.example.com:27017/
2018-06-02T06:48:34.156+0000 E NETWORK [thread1] SSL peer certificate validation failed: …
Run Code Online (Sandbox Code Playgroud) 我的项目中有一个课程。在课堂上我需要做两个内部选择,以知道是否有任何重复,但我认为如果我得到重复错误然后管理它比选择更好。错误开销 Vs。两个内选,哪个?
可能的重复:
select count(*) 和 select count(any_non_null_column) 之间有什么区别?
我有一个类型为 char(0) 的列。有些行是NULL,有些是空的('')。问题是,当我运行以下查询时,结果将为 0。 SELECT count(id) FROM test WHERE id IS NULL
但是当我运行以下查询时,结果是正确的:SELECT count(*) FROM test WHERE id IS NULL
我有一个专栏,为什么会这样?
我有users
表:
CREATE TABLE `users` (
`uid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`email` varchar(70) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`flname` varchar(60),
PRIMARY KEY (`uid`)
) ENGINE=InnoDB
Run Code Online (Sandbox Code Playgroud)
还有一个关系表:
CREATE TABLE `relationship` (
`rid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`from` mediumint(8) unsigned NOT NULL,
`to` mediumint(8) unsigned NOT NULL,
PRIMARY KEY (`rid`),
UNIQUE KEY `from_2` (`from`,`to`),
KEY `to` (`to`),
CONSTRAINT `relationship_ibfk_1` FOREIGN KEY (`from`) REFERENCES `users` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `relationship_ibfk_2` FOREIGN KEY (`to`) REFERENCES …
Run Code Online (Sandbox Code Playgroud) 假设我有一个words
包含非常多记录的表。
列是id
和name
。
在words
我的表格中,例如:
'systematic', '????','gear','synthesis','mysterious', etc.
Run Code Online (Sandbox Code Playgroud)
注意:我们也有 utf8 字样。
如何有效地查询,看看哪些词包含字母's'
,'m'
和'e'
(所有的他们)?
输出将是:
systematic,mysterious
Run Code Online (Sandbox Code Playgroud)
我不知道如何做这样的事情。它应该是高效的,否则我们的服务器会受到影响。
我有一个写入密集型的网络应用程序,我买了一个 768M RAM 的 VDS
我将 bulk_insert_buffer_size 指定为 126M,其他一些参数如下:
[mysqld]
bulk_insert_buffer_size=126M
set-variable = max_connections=500
safe-show-database
max_user_connections=200
key_buffer_size = 16M
query_cache_size = 50M
tmp_table_size = 50M
max_heap_table_size = 200M
thread_cache_size = 4
table_cache = 80
thread_concurrency = 8
innodb_buffer_pool_size = 100M
innodb_log_file_size = 25M
query_cache_limit = 50M
innodb_flush_log_at_trx_commit = 2
Run Code Online (Sandbox Code Playgroud)