MySQL:一张巨大的桌子。无法查询,即使是简单的选择!

时间:2010-03-05 12:38:17

标签: mysql performance select

我有一张约有200,000条记录的表格。 执行简单的选择查询需要很长时间。我很满意,因为我在4核CPU和4GB内存下运行。 我该怎么写我的查询? 或与INDEXING有什么关系?

重要说明:我的表格是静态的(它的数据不会改变)。

你的解决方案是什么?

PS

1 - 我的桌子有一个主键id

2 - 我的桌子有一个唯一的密钥serial

3 - 我想查询where param_12 not like '%I.S%'等其他字段  或where param_13 = '1'

4 - 200,000并不大,这正是我感到惊讶的原因。

5 - 添加简单字段时甚至出现问题:my question

6 - 我可以为BOOL字段创建一个INDEX吗? (或者它是否有用)

PS 并感谢您的回答

7 - 我的选择shoudl返回指定'I.S'或没有指定的字段。

select * from `table` where `param_12` like '%I.S%'

这就是我想要的。似乎没有Index在这里有所帮助。火腿?

7 个答案:

答案 0 :(得分:3)

索引会有所帮助。请发布表格定义并选择查询 为where子句中的所有“=”列添加索引。

答案 1 :(得分:2)

是的,您需要/需要为此表编制索引,并且分区也会有所帮助。正确地执行此操作是您需要提供更多信息的方法。您将需要使用EXPLAIN PLAN并查看您的查询以确定哪些列以及您应该如何索引它们。

要考虑的另一个方面是您的表是否已标准化。由于I / O降低,归一化表往往会提供更好的性能。

我意识到这是模糊的,但没有更多的信息就像我们一样具体。

BTW:200,000行的表格相对较小。

Here是您可能会觉得有用的另一个问题

答案 2 :(得分:1)

1 - 我的表有一个主键id:除非你使用一些需要数字主键的方案,否则不是很有用

2 - 我的表有一个唯一的密钥序列:根据定义,id也是唯一的;为什么不使用serial作为主要?这个被自动编入索引,因为您将其定义为唯一。

3 - 我想查询其他字段,例如param_12不喜欢'%I.S%'或param_13 ='1':like '%something%'查询不能真正使用索引;有什么方法可以将param12改为param 12a,这是第一个%,而param12b是'I.S%'?如果起始字符串已知,则可以在like语句中使用索引。

< - > 4 - 200,000并不大,这正是我感到惊讶的原因:是的,200.000并不是那么多。但是如果没有好的索引,查询和/或缓存大小MySQL将需要从磁盘读取所有数据进行比较,这很慢。

5 - 添加简单字段时甚至出现问题:我的问题

6 - 我可以为BOOL字段创建一个INDEX吗?是的,你可以,但是匹配一半时间的索引是相当无用的,索引用于限制MySQL必须尽可能多地加载的记录数量;如果索引没有显着限制该数量,通常是boolean(在50-50分布中)的情况下,使用索引只需要更多的磁盘IO并且可以减慢搜索速度。因此,除非你期望80-20分布或更好的创建索引会花费时间,而不是赢得时间。

答案 3 :(得分:1)

本例中可能会使用param_13上的索引,但不会使用param_12上的索引,因为使用LIKE '%会否定索引的使用。

答案 4 :(得分:1)

如果您使用LIKE '%asdasdasd%'查询数据,则没有索引可以帮助您。它必须每次都进行全面扫描。这里的问题是前导%,因为这意味着您要查找的子字符串可以在字段中的任何位置 - 因此它必须全部检查。

您可能会查看全文索引,但可能会根据您的需要而不适合。

答案 5 :(得分:0)

首先,确保您的表有主键。

要回答更详细的信息,您需要提供有关表格结构和正在运行的查询类型的更多信息。

答案 6 :(得分:0)

我不相信你拥有的钥匙会有所帮助。您必须索引WHERE子句中使用的列。

我也想知道LIKE是否需要表扫描而不管索引。你使用类似函数的那一刻就会失去索引的值,因为你必须检查每一行。

你是对的:200K不是一张大桌子。 EXPLAIN PLAN将在这里提供帮助。如果您看到TABLE SCAN,请重新设计。