代码之家  ›  专栏  ›  技术社区  ›  Alexar

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

  •  1
  • Alexar  · 技术社区  · 15 年前

    我有一张大约有200000张唱片的桌子。 执行简单的select查询需要很长时间。我很自信,因为我在4核cpu和4GB内存下运行。 我应该如何编写查询? 还是与索引有关?

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

    你的解决方案是什么?

    PS

    1-我的表有一个主键 id

    2-我的桌子有一个唯一的键 serial

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

    4-200000不是很大,这正是我感到惊讶的原因。

    偶-添加一个简单字段时出现问题5: my question

    6-我可以为布尔字段创建索引吗?(还是有用)

    附言 谢谢你的回答

    7-我的选择应返回指定了“I.S”或未指定的字段。

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

    这就是我想要的。这里似乎没有什么索引有用。火腿

    7 回复  |  直到 8 年前
        1
  •  3
  •   Padmarag    15 年前

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

        2
  •  2
  •   Community CDub    8 年前

    是的,您需要索引这个表,分区也会很有帮助。正确地做这件事需要你提供更多信息。您需要使用EXPLAIN PLAN并查看查询,以确定哪些列以及应该如何对它们进行索引。

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

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

    顺便说一句:20万行的表格相对较小。

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

        3
  •  1
  •   extraneon    15 年前

    1-我的表有一个主键id:除非使用需要数字主键的方案,否则没有真正的用处

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

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

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

    5-我甚至在添加一个简单字段时遇到问题:我的问题

    6-我可以为布尔字段创建索引吗?是的,你可以,但是一个索引匹配一半的时间是相当无用的,一个索引被用来限制MySQL必须尽可能多地完全加载的记录量;如果一个索引没有显著地限制这个数字,就像布尔型(50-50分布)的情况一样,那么使用索引只需要更多的磁盘IO,并且可能会降低搜索速度。因此,除非你期望发行量达到80-20或更好,否则创建一个索引将花费时间,而不是赢得时间。

        4
  •  1
  •   Romuald Brunet    15 年前

    索引 param_13 可能会用到,但不是上面的那个 param_12 在本例中,由于 LIKE '% 否定索引的使用。

        5
  •  1
  •   Vilx-    15 年前

    如果您使用 LIKE '%asdasdasd%' 那么没有索引可以帮助你。它每次都要做一次全面扫描。这里的问题是主要问题 % 因为这意味着你正在寻找的子字符串可以在字段中的任何地方,所以它必须全部检查。

    也许你可以研究全文索引,但根据你的需要,这可能并不合适。

        6
  •  0
  •   Paul    15 年前

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

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

        7
  •  0
  •   duffymo    15 年前

    我不相信你的钥匙会有用。必须对WHERE子句中使用的列进行索引。

    我还想知道,这样做是否需要表扫描,而不考虑索引。在使用这样的函数的那一刻,你就失去了索引的值,因为你必须检查每一行。

    你说得对:20万不是一张大桌子。解释一下这个计划会有帮助。如果你看到表格扫描,重新设计。