这是真的?表现问题

时间:2009-09-27 09:56:36

标签: sql mysql performance

我听说你应该在表格中的所有其他类型之前有你的int类型字段。他们说查询运行得更快或者其他什么。这是真的吗?

例如 -

  • id int(10)
  • time int(11)
  • user_id int(10)
  • title varchar(128)
  • text text

...而不是:

  • id int(10)
  • title varchar(128)
  • text text
  • time int(11)
  • user_id int(10)

4 个答案:

答案 0 :(得分:3)

我确信这不会产生太大的影响,但您可以对大型数据集进行基准测试以进行尝试。我搜索了优秀的MySQL Performance Blog,没有找到任何东西。 MySQL manual section on optimization就是这么说的,这只是一点点相关

  

对于MyISAM表,如果没有   任何可变长度列(VARCHAR,   TEXT或BLOB列),固定大小   使用行格式。这比较快但是   不幸的是可能浪费一些空间。   请参见第13.1.3节“MyISAM表”   存储格式“。你可以提示一下   你想拥有固定长度的行   即使你有VARCHAR列   CREATE TABLE选项   ROW_FORMAT = FIXED。

答案 1 :(得分:0)

任何差异都可以忽略不计。对列进行排序,以便最重要的列排在最前面,最长(字符串)列最后(仅为了可读性):键,然后是外键,然后是数字属性,然后是字符串。

答案 2 :(得分:0)

在不知道MySQL的细节的情况下,假设文本类型被添加到主数据表中而不是对某些其他内部数据表的引用,并且底层RDBMS不会在内部将列的顺序更改为最佳列,那么是,这会导致性能问题。

原因是数据库通常将表中的行存储为一组基于数据类型对齐的字节。这意味着由于DB知道表数据类型是例如id (x bits)something(y bits)+date(z bits),所以选择所有id:s就像选择0 ... x bitz然后用y + z位递增偏移一样简单直到DB点击实际表文件的末尾。

但是,如果在其中间包含一个可变长度列,则必须对每一行进行下一次偏移的其他计算,这可能会导致性能问题,尤其是在您拥有大型数据集时( =大量行) )在一个表中。

答案 3 :(得分:0)

这似乎不太可能,因为这是一个问题,数据库的第一个优化是以最有效的顺序存储列,而不管它们的定义顺序如何。

也许,如果你的英语不好,引用是在索引中使用int吗?例如,您应该使用int作为主键而不是字符串(例如GUID),因为int使用哈希表比使用随机GUID或其他字符串更有效。此外,如果可以,您应该首先在索引定义中放置int列,因为顺序确实有所不同,并且在字符串之前使用int将更有效(假设您的索引仍然按此顺序用于您的应用程序需求)。