Tag: 索引

Python – 在Python中获取列表的最后一个元素

在Python中,如何获得列表的最后一个元素? 答案: some_list[-1] 是最短和最Pythonic。 实际上,您可以使用此语法执行更多操作。该some_list[-n]语法获取第n到最后一个元素。所以some_list[-1]得到最后一个元素,some_list[-2]得到倒数第二个,等等,一直到底some_list[-len(some_list)],这给你第一个元素。 您也可以这种方式设置列表元素。例如: >>> some_list = [1, 2, 3] >>> some_list[-1] = 5 # Set the last element >>> some_list[-2] = 3 # Set the second to last element >>> some_list [1, 3, 5] 请注意,IndexError如果预期的项目不存在,则按索引获取列表项将引发一个列表项。这意味着some_list[-1]如果some_list为空则会引发异常,因为空列表不能包含最后一个元素。 如果您str()或list()对象可能最终变为空,astr = ''或者alist = ,那么您可能希望使用alist[-1:]而不是alist[-1]对象“相同”。 这意味着: alist = alist[-1] # will generate an IndexError exception whereas alist[-1:]

mysql – 如何在使用MySQL的Ruby on Rails迁移中处理太长的索引名称?

我正在尝试添加一个由四个关联表(用户,大学,subject_names,subject_types)的外键创建的唯一索引: add_index :studies, ["user_id", "university_id", \ "subject_name_id", "subject_type_id"], :unique => true MySQL对索引名称的限制会导致迁移停止。这是错误消息: 表’学习’上的索引名’index_studies_on_user_id_and_university_id_and_subject_name_id_and_subject_type_id’太长; 限制是64个字符 我该如何处理?我可以使用别名吗? 使用: add_index :studies, ["user_id", "university_id", \ "subject_name_id", "subject_type_id"], :unique => true, :name => 'my_index' 更多信息在add_index中。 您还可以更改create_table块中列定义中的索引名称(例如,从迁移生成器中获取)。 create_table :studies do |t| t.references :user, index: {:name => "index_my_shorter_name"} end 在PostgreSQL,在默认情况下限制为63个字符。因为索引名称必须是唯一的,所以有一点约定是很好的。我使用(我调整了示例来解释更复杂的构造): def change add_index :studies, [:professor_id, :user_id], name: :idx_study_professor_user end 正常的索引应该是: :index_studies_on_professor_id_and_user_id 逻辑是: index 变 idx

数据库索引如何工作?

鉴于索引是非常重要的,因为你的数据集的规模增加了,有人可以解释索引如何在数据库无关的层面上工作吗? 有关索引字段的查询的信息,请查看如何索引数据库列。 答案 为什么需要? 当数据存储在基于磁盘的存储设备上时,它将作为数据块存储。这些块被完整访问,使它们成为原子磁盘访问操作。磁盘块的结构与链接列表非常相似,都包含数据部分,指向下一个节点(或块)位置的指针,并且都不需要连续存储。 由于许多记录只能在一个字段上排序,所以我们可以声明,在未排序的字段上搜索需要线性搜索,它需要N/2块访问(平均),N块的数量在哪里桌子横跨。如果该字段是非关键字段(即不包含唯一条目),则必须在N块访问时搜索整个表空间。 而对于排序的字段,可以使用二进制搜索,其具有log2 N块访问。此外,由于数据是在给定非关键字段的情况下进行排序的,因此一旦找到更高的值,表格的其余部分就不需要搜索重复值。因此,性能增加是相当大的。 什么是索引? 索引是一种对多个字段上的多个记录进行排序的方法。在表中的字段上创建索引会创建另一个数据结构,该结构保存字段值以及指向与其相关的记录的指针。然后对索引结构进行排序,从而对其执行二进制搜索。 索引的缺点是这些索引在磁盘上需要额外的空间,因为索引使用MyISAM引擎一起存储在一个表中,如果同一个表中的许多字段是相同的,那么该文件可以快速达到底层文件系统的大小限制索引。 它是如何工作的? 首先,让我们概述一个示例数据库表模式; 字段名称数据类型磁盘上的大小 id(主键)无符号整数4字节 firstName Char(50)50个字节 姓氏字符(50)50个字节 emailAddress字符(100)100个字节 注意:字符被用来代替varchar以允许磁盘值的准确大小。此样本数据库包含500万行,并且未进行索引。现在将分析几个查询的性能。这些是使用id(排序的关键字段)的查询和使用firstName(非关键字未排序的字段)的查询。 示例1 –分类与未排序的字段 鉴于我们的示例数据库中r = 5,000,000记录的固定大小给出了记录的R = 204字节长度,并且它们使用MyISAM引擎存储在表中,该引擎使用默认块大小B = 1,024字节。该表的阻止因子将是bfr = (B/R) = 1024/204 = 5每个磁盘块的记录。保持表格所需的块的总数是N = (r/bfr) = 5000000/5 = 1,000,000块。 如果N/2 = 500,000id字段是关键字段,那么对id字段进行线性搜索需要平均访问块来查找值。但是由于id字段也被排序,所以可以进行二分搜索,要求平均log2 1000000 = 19.93 = 20访问块。瞬间我们可以看到这是一个巨大的改进。 现在,firstName字段既没有排序也没有关键字段,因此二进制搜索是不可能的,并且这些值也不是唯一的,并且因此该表格将需要搜索到末尾以进行精确的N = 1,000,000块访问。索引编制旨在纠正这种情况。 鉴于索引记录仅包含索引字段和指向原始记录的指针,因此它会比它指向的多字段记录更小。所以索引本身需要的磁盘块比原始表要少,因此需要更少的块访问来遍历。firstName字段上的索引模式概述如下; 字段名称数据类型磁盘上的大小 firstName Char(50)50个字节