[英]MySQL Huge table select performance
我目前有一个包含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
除了为mysql服务器提供更多的可用内存之外,还要删除不必要的索引并确保您在column1上具有索引(针对您的情况)。 如果可能,将限制子句添加到sql。
没有足够的信息来可靠地诊断问题,但是您声明您在具有32G内存的系统上使用“默认” my.cnf / my.ini文件。
从MySQL文档提供以下预配置文件:
最好的情况是,您正在使用的配置文件占用了系统内存的1/8(如果您使用的是“ Heavy”文件,据我所知这不是默认文件。我认为默认文件是中或大)。
我建议适当地编辑my.cnf文件。
MySQL的几个区域可以对其内存分配进行调整,以使特定情况下的性能最大化。 您可以在此处发布my.cnf / my.ini文件,以获取更多具体建议。 您还可以使用MySQL Tuner获得一些自动化建议。
我在查询时间上做出了很大的改变,但这并不是在所有情况下都有用,就我而言
我有一张巨大的桌子(大约2,350,000条记录),但是我可以期待我应该玩的确切位置
所以我添加了这个条件WHERE id > '2300000'
就像我说WHERE id > '2300000'
那样,但这可能会帮助其他人,所以完整的查询将是:
SELECT primary from mytable where id > '2300000' AND column1 = int AND bitcolumn = b'1'
查询时间为2〜3秒,且不小于0.01
首先,您的查询
select primary from from mytable where column1 = int and bitcolumn = b'1'
有一些错误,例如两个from
子句。 其次,拆分表并使用不必要的索引对性能毫无帮助。 要遵循的一些技巧是:
1)如果您重复查询某些列,请使用复合索引。 但是必须采取预防措施,因为在复合索引中,在索引中放置列的顺序非常重要。
2)如果主键位于
int
列上,则它会更有帮助。3)阅读一些有关索引和优化的文章,它们很多,可以在Google上搜索。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.