我正在使用mySQL来建立股票期权数据库.大约有330,000行(每行是1个选项).我是SQL的新手,所以我试图决定字段类型,如选项符号(4到5个字符),股票代码(1到5个字符),公司名称(从5到60不等)字符).
我想优化速度.两者都创建了数据库(当新的价格数据出来时每5分钟发生一次 - 我没有实时数据馈送,但它几乎是实时的,因为我得到一个新的文本文件,其中有330,000行传送给我每5分钟;这个新数据完全取代以前的数据),也用于查找速度(将有一个基于Web的前端,许多用户可以运行即席查询).
如果我不关心空间(因为数据库生命周期是5分钟,每行包含大约300字节,所以整个事情可能只有100MB)那么构建字段的最快方法是什么?
实际上,数字字段的问题相同:int(11)和int(7)之间是否存在性能差异?对于查询和排序,一个长度是否比另一个更好?
谢谢!
在MyISAM中,制作固定宽度的记录有一些好处.VARCHAR是可变宽度.CHAR是固定宽度的.如果您的行只有固定宽度的数据类型,那么整行是固定宽度的,并且MySQL在计算该表中的行空间要求和偏移量方面获得了一些优势.也就是说,优势可能很小,并且几乎不值得一个可能的微小增益,其他成本(如缓存效率)超过固定宽度,填充CHAR列,其中VARCHAR可以更紧凑地存储.
它变得更高效的断点取决于您的应用程序,除了您测试两种解决方案并使用最适合您的应用程序使用数据的解决方案之外,这不是可以解决的问题.
关于INT(7)与INT(11),这与存储或性能无关.MySQL的INT类型参数与数据大小有关,这是一个常见的误解 - 它没有.MySQL的INT数据类型总是32位.括号中的参数指的是使用ZEROFILL显示值时要填充的位数.例如,INT(7)将显示0001234,其中INT(11)将显示00000001234.但此填充仅在显示值时发生,而不是在存储或数学计算期间.
如果字段中的实际数据大小变化很大,则varchar更好,因为它会导致更小的记录,而较小的记录意味着更快的DB(更多记录可以适应缓存,更小的索引等).出于同样的原因,如果您需要最大速度,使用较小的整数会更好.
OTOH,如果方差很小,例如一个字段最多有20个字符,并且大多数记录实际上接近20个字符长,那么char更好,因为它允许DB进行一些额外的优化.但是,这实际上只对表中的所有字段都是如此,因为那时你有固定大小的记录.如果速度是您主要考虑的问题,那么将任何非固定大小的字段移动到单独的表中甚至是值得的,如果您的查询仅使用固定大小的字段(或者如果您只有霰弹枪查询).
最后,很难概括,因为很大程度上取决于您实际应用的访问模式.