- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正面临一些问题,表的速度越来越快(目前有 4mio 行,每天插入 300k)。我希望我能在这里得到一些想法和建议,以改进我的设置,并在不久的将来关闭我的网站之前从我的盒子中挤出最后一点。
设置:
Intel i7 720
8GB RAM
2x750GB SATA RAID 0
CentOS
MySQL 5.5.10
Node.js + node-lib_mysql-client
表定义:
CREATE TABLE IF NOT EXISTS `canvas` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`x1` int(11) NOT NULL,
`y1` int(11) NOT NULL,
`x2` int(11) NOT NULL,
`y2` int(11) NOT NULL,
`c` int(4) unsigned NOT NULL,
`s` int(3) unsigned NOT NULL,
`m` bigint(20) unsigned NOT NULL,
`r` varchar(32) NOT NULL,
PRIMARY KEY (`id`,`x1`,`y1`) KEY_BLOCK_SIZE=1024,
KEY `x1` (`x1`,`y1`) KEY_BLOCK_SIZE=1024,
KEY `x2` (`x2`,`y2`) KEY_BLOCK_SIZE=1024
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT KEY_BLOCK_SIZE=4
/*!50100 PARTITION BY HASH ( (
(
x1 MOD 10000
)
) + y1 MOD 10000)
PARTITIONS 10 */ AUTO_INCREMENT=13168904 ;
查询:
SELECT x1,y1,x2,y2,s,c,r,m FROM canvas
WHERE 1 AND ((
x1 >= 0
AND x1 <= 400
AND y1 >= 0
AND y1 <= 400
) OR (
x2 >= 0
AND x2 <= 400
AND y2 >= 0
AND y2 <= 400
) )
ORDER BY id desc
这是我正在执行的唯一查询,除了 x1、y1、x2 和 y2 的值在每次查询时都会发生变化。它是一个二维 Canvas ,每一行代表 Canvas 上的一条线。我想知道为 1 个字段选择的最大范围永远不会大于 1200(像素)也很重要。几周前我升级到 MySQL 5.5.10 并开始使用分区。 'x1 % 10000' hashw 作为我进入分区主题的第一个也是不知道的方法。它已经使我的 SELECT 速度有了相当大的提升,但我确信仍有优化空间。
哦,在你问之前...我知道我正在使用 MyISAM 表这一事实。我的一个 friend 建议使用 innoDB,但已经尝试过了,结果是表大了 2 倍,而且 SELECT 性能大幅下降。我不需要任何花哨的交易和东西....我需要的是尽可能最好的 SELECT 性能和 INSERT 的体面性能。
你会改变什么?我能以某种方式调整我的索引吗?我的分区设置是否有意义?我是否应该增加分区文件的数量?
欢迎所有建议...我还与 friend 讨论了将本地复制到内存表中的问题,但我确信表大小超出我的 RAM 只是时间问题,交换盒是一个相当不错的选择丑陋的东西。
当您考虑我的问题时,请记住它正在快速且不可预测地增长。万一它由于某种原因在某个地方传播开来,我预计每天会看到超过 1mio 的插入。
感谢您的阅读和思考。 :)
编辑:请求的解释结果
select_type table type possible_keys key key_len ref rows Extra
SIMPLE canvas index_merge x1,x2 x1,x2 8,8 NULL 133532 Using sort_union(x1,x2); Using where; Using fileso...
EDIT2:请求的 my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
innodb_buffer_pool_size = 1G
sort_buffer_size = 4M
read_buffer_size = 1M
read_rnd_buffer_size = 16M
innodb_file_format = Barracuda
query_cache_type = 1
query_cache_size = 100M
# http://dev.mysql.com/doc/refman/5.5/en/performance-schema.html
;performance_schema
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
innoDB 值用于我的 innoDB 尝试……我猜它们不再是必需的了。该服务器还运行其他 4 个网站,但它们相当小,不值得一提。不管怎样,我很快就会把这个项目转移到一个专用的盒子里。您的想法可能很激进 - 我不介意实验。
EDIT3 - 带索引的基准
好吧,伙计们……我已经用不同的索引做了一些基准测试,到目前为止,结果还不错。对于此基准测试,我选择了 2000x2000 像素的框中的所有行。
SELECT SQL_NO_CACHE x1,y1,x2,y2,s,c FROM canvas_test WHERE 1 AND (( x1 BETWEEN -6728 AND -4328 AND y1 BETWEEN -6040 AND -4440 ) OR ( x2 BETWEEN -6728 AND -4328 AND y2 BETWEEN -6040 AND -4440 ) ) ORDER BY id asc
使用我在上面发布的表/索引定义平均查询时间是:1740ms
然后我删除了所有索引,除了主键 -> 1900ms
为 x1 添加了一个索引 -> 1800ms
为 y1 添加了一个索引 -> 1700ms
为 x2 添加了一个索引 -> 1500ms
为 y2 添加了一个索引 -> 900ms!
到目前为止,这非常令人惊讶...出于某种原因,我认为为 x1/y1 和 x2/y2 制作组合索引在某种程度上是有意义的,但实际上我错了。
EXPLAIN 现在返回这个:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE canvas_test index_merge x1,y1,x2,y2 y1,y2 4,4 NULL 263998 Using sort_union(y1,y2); Using where; Using fileso..
现在我想知道为什么它使用 y1/y2 作为键而不是全部四个?
但是,我仍在寻找更多的想法和建议,尤其是关于分区和适当的散列。
最佳答案
首先,我将 SELECT 修改为
SELECT x1,y1,x2,y2,s,c,r,m FROM canvas
WHERE
x1 BETWEEN 0 AND 400 AND y1 BETWEEN 0 AND 400 OR
x2 BETWEEN 0 AND 400 AND y2 BETWEEN 0 AND 400
ORDER BY id desc
还要确保在该表达式上有一个索引:
CREATE INDEX canvas400 ON canvas(
x1 BETWEEN 0 AND 400 AND y1 BETWEEN 0 AND 400 OR
x2 BETWEEN 0 AND 400 AND y2 BETWEEN 0 AND 400
)
关于MYSQL:需要帮助快速增长表和降低速度(4mio 行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6051983/
我在堆栈上创建了这段代码: function increase_brightness(hex, percent){ var r = parseInt(hex.substr(1, 2), 16)
为什么我能够LOWER COALESCE 中的每个项目,但无法LOWER整个COALESCE,否则我会遇到语法错误?例如: SELECT COALESCE(LOWER(google_provider_
我在谷歌上搜索到的所有内容都表明,以下任何一项都会将 double 舍入到小数点后两位。 double roundToFourDecimals(double d) { DecimalForma
我正在开发一个 flexdashboard/storyboard,我想在其中降低每个帧的高度。那可能吗? 示例代码: --- title: "Flex" output: flexdashboard
我在 WPF 中有一个图像控件。我需要减小图像尺寸控件的宽度和高度。但是当我这样做时,图像看起来不太好。数据丢失更多。 所以我想降低图像分辨率而不是仅仅改变图像控件的宽度和高度。 任何人都可以帮助我如
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题?通过 editing this post 添加详细信息并澄清问题. 1年前关闭。 Improve this
我正在扩展 Fluent NHibernate,以便更好地与 F# 一起使用(即引用支持),并希望获得一些关于降低 API 流畅性的反馈。 F# 要求使用返回值,除非它们是单位类型。所以这最终以“|>
我们有一个 BizTalk 2010 接收位置,它将获取一个 70MB 的文件,然后使用入站映射(在接收位置)和出站映射(在发送端口)生成一个 1GB 文件。 执行上述过程时,SQL Server 会
我的代码分析插件提示包含以下代码的方法中的代码复杂性。我注意到以下代码看起来可以组合,但我不知道如何做到这一点: for(Command command : commands) { if (c
我正在寻找一种方法来始终忽略 R 中 float 之间的微小差异(根据 IEC 60559,这些是 double 浮点),通过使用基本 R 工具而不诉诸 C 或 C++。换句话说,我想“四舍五入” d
在 Blazor 中使用 ChartJs.Blazor 的 BarChart 组件时是否可以降低甚至关闭动画速度?我发现这个 NuGet 包非常有用,但我不知道如何在更新条形图时关闭动画。为了更容易忽
所以我为一个游戏编写了这段代码,现在该游戏的速度非常快。我想降低 FPS,让游戏慢一点。 我认为我唯一的出路就是制作一个计时器。但我发现很难找到放置计时器的位置?谁能帮我解决这个问题吗? 所以我为一个
我正在编写一个程序,我担心它运行所需的时间和所占用的空间。 在程序中我使用了一个变量来存储数组的长度: int len=newarray3.length; 现在,我想知道是否能够通过不使用 len 变
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 2 年前。 Improve th
我用Java编写了一个程序,但它的计算时间很长,我不知道为什么。有人可以指点一下以降低复杂性吗?此外,在计算一些值(例如 3,100 之后)后,它会给出空指针异常。代码: public class F
我有下图,由 1 行 2 列的网格组成。我愿意 降低右侧子图的高度(3D PREDICTION),使棋盘平面看起来有点挤压并显示更好的视角。 在左侧子图的顶部添加一些边距(2D PREDICTION)
是否有一种简单的方法可以更改以 RGB 字符串形式给出的颜色的亮度? 例如 in_RGB = '#FF0000' --> out_RGB = '#CC0000' 最佳答案 将十六进制字符串转换为 R
我已经编写了代码来更改对象(不是进程)(在本例中是文件)的完整性级别。据我们所知,我们从中等完整性级别开始,但我想将其降低到“低”。我想运行完整性较低的 .txt 文件而不是默认介质。 我使用 WIN
是否可以在保持原始宽高不变的情况下降低图像分辨率? 我已经使用 BitmapFactoryOptions 尝试了几个选项: 在样本大小 inDensity、inScaled、inTargetDensi
是否有高级(Java)或低级方式(使用 native 代码)将 Android 设备上的蓝牙信号强度更改为最低? 目标是使设备在 20 厘米范围内可被发现?在 Internet 上根本找不到与此相关的
我是一名优秀的程序员,十分优秀!