查询大型表需要花费大量时间

时间:2016-05-21 06:05:40

标签: mysql sql

我的表ArchiveArseh大小为15GB,行记录为198997,其中包含引擎innoDB(以及将来的400G和1000000记录)。

此表包含图像(字段documentthumbDocument)。 enter image description here

on filed(Id)是主键,4个字段被编入索引。 enter image description here

解释 enter image description here enter image description here

运行简单查询时选择

SELECT *
FROM archivearseh
WHERE CONCAT(BlockCode,ArsehRow)='01011000106001'

SELECT *
FROM archivearseh
WHERE BlockCode='106001' and ArsehRow='01011000'

获得2分钟返回结果?!

如何减少运行查询的时间?

2 个答案:

答案 0 :(得分:0)

使用BlockCode和ArsehRow列在表上创建索引。

答案 1 :(得分:0)

问题是您的 WHERE CONCAT(BlockCode,ArsehRow)='01011000106001' 不是 SARGEABLE

CONCAT

所以 CANT 使用索引,并且必须为每一行计算 SET NewColumn = CONCAT(BlockCode,ArsehRow) CREATE INDEX for NewColumn; and WHERE NewColumn = '01011000106001'

因此,您可以在更新/插入时创建触发器来更新列并索引该字段,以便搜索速度更快(但更新/插入速度会更慢)。

WHERE BlockCode LIKE '010110%'
  AND CONCAT(BlockCode,ArsehRow)='01011000106001'

或做一些事情来减少搜索域,如

 public static int int_to_int(int input)
    {
        int[] value_array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
                11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
                21, 22, 23, 24, 25, 26};
        int[]bin_array= {00000, 00001, 00010, 00011,
                00100, 00101, 00110, 00111,
                01000, 01001, 01010, 01011, 01100,
                01101, 01110,  01111, 10000, 10001,
                10010,  10011, 10100, 10101, 10110,
                10111, 11000,11001, 11010, 11011};
        for(int i=0; i <27; i++)
        {
            System.out.println("hello");
            if(input==value_array[i])
            {
                System.out.println("returning: " + Integer.toOctalString(bin_array[i]) + "at: " + i);
                return bin_array[i];

            }
        }
        return -1;
    }