2013-12-16 183 views
1

创建一个表是这样的:查询优化

CREATE TABLE test (a INT(10), b char(10)); 

增加两个指标:

alter table test add key aa (a), add key bb (b); 

插入一些行:

insert into test values (132,'logi'); 
insert into test values (322,'koko'); 
insert into test values (32,'kola'); 

等等

您可以使用少量的行进行测试但在我的应用程序将有1亿行的所以我要问是有道理的: 所以,让我们说,我想执行两个查询:

1) explain select * from test where b like "frif%"; 
2) explain select * from test where a like "32%"; 

第一个使用指数BB由于B是一个char,而第二个不使用索引aa,因为a只是一个INT(我把它当作char!)。 我怎样才能使第二个查询作为第一个执行和搜索像“some_number%”的数字,并使范围类型的查询,而不是所有(如解释显示)。

+1

INT被转换成字符串,这就是为什么指数不工作。 –

+1

也许一个基于函数的索引将其转换为字符数据。从而创建引擎可能使用的索引。 – xQbert

+0

xQbert,我试着做你用CAST函数建议的东西,但是像这样:(解释)select * from test where cast(a as CHAR)like“32%”;不工作! –

回答

1

如果您将数字视为字符串,则以此方式存储。这听起来像数字是一种代码。尽管由数字组成,但它实际上只是某个东西的名称(如帐号)。

如果数量是固定的长度,说5,那么你可以做:

where a >= 32000 and a < 33000; 

你可以扩展这个想法不同长度:

where a >= 32 and a < 33 or 
     a >= 320 and a < 330 or 
     a >= 3200 and a < 3300 or 
     a >= 30000 and a < 33000 
+0

谢谢!我也认为这是一个解决方案,但它不能应用于我的问题,因为我的应用程序中的字段'a'(INT)是一个BIG INT,它包含大于12位数的数字,所以如果我将其更改为VARCHAR让我们说,我将有存储开销! –

+0

@JohnZobolas。 。 。为什么这不适用于你的情况?你只需要'where a> = 3000000000000和一个<3300000000000'或其他。 –

+0

当然,它可以应用:但我的意思是与存储开销是这样的:我有一个数字数字:BIGINT需要8个字节来存储。如果我将它作为VARCHAR声明在表定义中,它将需要每个数字1个字节(在这种情况下digit = char)。因此,对于大于8位的数字(我有很多),我将需要超过8个字节(例如,对于具有14个字符数字的num:VARCHAR,我需要14个字节的存储空间,这太多了)。 –