如果我有下表。
create_table :my_table, :id => false do |t|
t.string :key_column
t.string :value_column
end
我将如何确保通过 :key 字段为二进制搜索优化存储行?
我将如何确保使用二进制搜索?
如果我有下表。
create_table :my_table, :id => false do |t|
t.string :key_column
t.string :value_column
end
我将如何确保通过 :key 字段为二进制搜索优化存储行?
我将如何确保使用二进制搜索?
对于任何有趣的行数,通过键访问单个随机记录的最佳方式(对于“最佳”的大多数定义)是创建索引。
CREATE INDEX my_index ON my_table ( key_column );
或在 ActiveRecord 迁移中:
add_index(:my_table, :key_column)
数据库索引通常使用二分搜索,使用B-trees或类似的,这在存储成本和检索和更新时间之间提供了良好的平衡。
对于单表操作,确保使用索引应该相对简单:
MyTable.find_by_key_column('ABC123')
例如,应该生成这样的东西(检查 development.log):
SELECT * FROM my_table WHERE (key_column = 'ABC123')
即使是 MySQL 相对不起眼的优化器,在优化运行时也应该没有问题。
行存储不应该是单个行检索的问题,这是幸运的,因为无论如何您都无法控制它。对于 MySQL 性能,您可能应该选择 MyISAM 而不是 InnoDB 作为存储引擎,前提是您对“最佳”的定义不包括“最可靠”。
准确存储和检索数据是数据库的工作。你描述你想要什么,它就会交付它。如果您想具体控制它是如何进行的,那么数据库不是答案。