重要说明:我的表格是静态的(它的数据不会改变)。
你的解决方案是什么?
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在这里有所帮助。火腿?
答案 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语句中使用索引。
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,请重新设计。