MySQL巨表选择性能

MySQL巨表选择性能,mysql,Mysql,我目前有一个1000万行的表,需要大幅提高性能 我曾考虑过将这1张桌子分成20张500k的小桌子,但我无法提高性能 我已经为4列创建了4个索引,并将所有列转换为INT,我还有一个稍微有点小的列 我的基本查询是从mytable中选择primary,其中column1=int和bitcolumn=b'1',这仍然非常缓慢,我可以做些什么来提高性能 服务器规范 32GB内存,2TB存储空间,使用标准ini文件,我的处理器也是AMD Phenom II X6 1090T除了给mysql服务器更多的内存之

我目前有一个1000万行的表,需要大幅提高性能

我曾考虑过将这1张桌子分成20张500k的小桌子,但我无法提高性能

我已经为4列创建了4个索引,并将所有列转换为INT,我还有一个稍微有点小的列

我的基本查询是
从mytable中选择primary,其中column1=int和bitcolumn=b'1'
,这仍然非常缓慢,我可以做些什么来提高性能

服务器规范


32GB内存,2TB存储空间,使用标准ini文件,我的处理器也是AMD Phenom II X6 1090T

除了给mysql服务器更多的内存之外,删除不必要的索引,并确保在第1列上有索引(在您的情况下)。如果可能的话,在sql中添加一个limit子句。

没有足够的信息来可靠地诊断问题,但是您声明您正在一个内存为32G的系统上使用“默认”my.cnf/my.ini文件

从中,将提供以下预配置的文件:

  • 小型:系统已下载此(在您的服务器上):


    安装它,运行它,看看它说了什么-最好将输出粘贴到这里。

    首先,您的查询

    select primary from from mytable where column1 = int and bitcolumn = b'1' 
    
    有一些错误,例如来自子句的两个
    。其次,拆分表和使用不必要的索引对性能没有帮助。以下是一些建议:

    1) 如果同时重复查询某些列,请使用复合索引。但必须采取预防措施,因为在复合索引中,在索引中放置列的顺序非常重要

    2) 如果主键位于
    int
    列上,则主键更有用

    3) 阅读一些关于索引和优化的文章,它们太多了,在谷歌上搜索


    我做了一些在查询时间上有很大区别的事情 但它可能并不适用于所有情况,就我而言

    我有一张很大的桌子(大约2350000张唱片),但我可以预测我应该玩的确切位置

    所以我添加了这个条件
    WHERE id>'2300000'
    ,正如我所说,这是我的情况,但它可能会帮助其他人 因此,完整的查询将是:

    SELECT primary from mytable where id > '2300000' AND column1 = int AND bitcolumn = b'1'
    

    查询时间为2~3秒,不到0.01

    @barsju LOL,运行查询时CPU甚至没有超过10%,所以我认为这不会有帮助。您是否总是只选择一列+位?您是否尝试过调整内存使用率等?1000万行不是“巨大的”。请在您的问题中定义“慢”,并发布您的MySQL配置(省略密码或其他敏感信息)。你很有可能没有将内存正确地分配给MySQL)。@JoachimIsaksson大多数时候是的,但是它确实需要从mytable中选择x,x,x,其中column1=int,column2=int,column3=intIt通常是删除不必要索引的好建议,但这不会影响select性能。这将影响插入/更新/删除性能。请在此处获取有关调整的提示:@EricJ。是的,但是错误的索引会占用内存,如果配置错误,它们可能会被推送到磁盘,从而降低系统的速度。将未使用的索引推送到磁盘将对SELECT查询没有任何影响。