我目前有一个包含1000万行的表,需要大幅提升性能。
我曾考虑将这1张表分成20个500k的较小表,但我无法提高性能。
我为4列创建了4个索引,并将所有列转换为INT,我有另一个列。
我的基本查询是select primary from from mytable where column1 = int and bitcolumn = b'1'
,这仍然很慢,我能做些什么来提高性能?
服务器规范
32GB内存,2TB存储空间,并使用标准的ini文件,我的处理器也是AMD Phenom II X6 1090T
答案 0 :(得分:0)
除了为mysql服务器提供更多内存之外,还要删除不必要的索引,并确保在column1上有索引(在您的情况下)。如果可能的话,为sql添加一个limit子句。
答案 1 :(得分:0)
没有足够的信息来可靠地诊断问题,但是您声明在具有32G内存的系统上使用“默认”my.cnf / my.ini文件。
从MySQL Documentation发出以下预先配置的文件:
最好的情况是,您正在使用一个配置文件,该文件利用系统内存的1/8(如果您使用的是“重”文件,据我所知,这不是默认文件。我认为默认值为中等或大可能。
我建议您正确编辑my.cnf文件。
有several areas of MySQL可以调整内存分配,以最大限度地提高特定情况的性能。您可以在此处发布my.cnf / my.ini文件以获取更具体的建议。您还可以使用MySQL Tuner获取一些自动建议。
答案 2 :(得分:0)
答案 3 :(得分:0)
我做了一些与查询时间有很大不同的事情 但这可能并非对所有情况都有用,仅就我而言
我有一张巨大的桌子(大约2,350,000条记录),但是我可以期待应该与之比赛的确切位置
所以我添加了这个条件WHERE id > '2300000'
,因为我说的是我的情况,但这可能会帮助其他人
因此完整的查询将是:
SELECT primary from mytable where id > '2300000' AND column1 = int AND bitcolumn = b'1'
查询时间为2〜3秒,且不小于0.01
答案 4 :(得分:-1)
首先,您的查询
select primary from from mytable where column1 = int and bitcolumn = b'1'
有一些错误,例如两个from
子句。第二件事,拆分表并使用不必要的索引永远不会有助于提高性能。要遵循的一些提示是:
1)如果反复查询某些列,请使用复合索引。但必须采取预防措施,因为在复合索引中,在索引中放置列的顺序非常重要。
2)如果主键位于
int
列,则更有帮助。3)阅读一些有关索引和优化的文章,它们很多,在Google上搜索。