Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 备用钥匙的用途_Php_Mysql_Sql_Mongodb_Database - Fatal编程技术网

Php 备用钥匙的用途

Php 备用钥匙的用途,php,mysql,sql,mongodb,database,Php,Mysql,Sql,Mongodb,Database,辅助密钥的用途是什么?假设我有一个记录所有签入的表(类似于Foursquare),其中包含列id、user\u id、location\u id、post、time,并且可以有数百万行,许多人已经声明使用辅助键来加快流程 为什么这样做有效?而user\u id和location\u id都应该是辅助键吗 顺便说一句,我正在使用mySQL 编辑:将有一个页面列出/计算特定用户的所有签入,另一个页面列出已签入特定位置的所有用户 mySQL查询 类型1 类型2 键(也称为索引)用于加速查询。如果要查看

辅助密钥的用途是什么?假设我有一个记录所有签入的表(类似于Foursquare),其中包含列
id、user\u id、location\u id、post、time
,并且可以有数百万行,许多人已经声明使用辅助键来加快流程

为什么这样做有效?而
user\u id
location\u id
都应该是辅助键吗

顺便说一句,我正在使用mySQL

编辑:将有一个页面列出/计算特定用户的所有签入,另一个页面列出已签入特定位置的所有用户

mySQL查询

类型1

类型2


键(也称为索引)用于加速查询。如果要查看给定用户的所有签入,则需要在“用户id”字段上输入一个键。如果您想查看给定位置的所有检查,则需要在location\u id字段上建立索引。您可以在

上阅读更多内容。我想对您的问题和示例进行评论

我强烈建议您,因为您使用的是MySQL,所以请确保您的表使用innodb引擎类型,因为您可以自己研究很多原因

InnoDB的一个重要特性是具有引用完整性。这是什么意思?在签入表中,有一个外键
user\u id
,它是用户表的主键。通过引用完整性,MySQL将不允许您插入用户表中不存在的具有用户id的行。使用MyISAM,您可以。仅此一点就足以让您想要使用innodb引擎

对于有关键/索引的问题,基本上当定义表并为列或列的某些组合声明键时,mysql将创建一个索引

索引对于性能至关重要,因为表随着行的插入而增长

所有关系数据库和文档数据库都依赖于的实现。Btree非常有用的功能是使用可预测的查找次数查找项目(或不查找)。因此,当人们谈论关系数据库的性能时,其基本构建块是使用btree索引,这些索引是通过KEY语句或altertable或createindex语句创建的

为了理解这一点,假设您的用户表只是一个文本文件,每行一行,可能用逗号分隔。添加行时,文本文件中的新行将添加到底部

最终,您会发现文件中有10000行

现在,您想知道是否为姓史密斯的特定人员输入了一行。你怎么知道

没有对文件进行任何排序或单独的索引,您只有一个选项,即从文件的第一行开始,扫描表中的每一行以查找匹配项。即使您找到了一个Smith,该Smith也可能不是表中唯一的“Smith”,因此每次执行此搜索时,您都必须从上到下读取整个文件

显然,随着表的增长,搜索性能越来越差

用关系数据库的说法,这就是所谓的“表扫描”。数据库必须从第一行开始,扫描每一行,直到最后

如果没有索引,关系数据库仍然可以工作,但它们高度依赖于IO性能

使用Btree索引,首先在索引中找到要查找的行。索引有一个直接指向所需数据的指针,因此不再需要扫描表,而是读取所需的各个数据页。这就是数据库如何在有数百万行、10行或100行的情况下保持足够的性能

要真正开始了解mysql的工作原理,您需要熟悉。。。并开始查看查询的解释计划。像您提供的那些简单的计划将有一些简单的计划,这些计划将显示要检查多少行以获得结果,以及它们是否使用一个或多个索引

对于摘要查询,索引没有帮助,因为您正在进行计数()。如果没有其他限制搜索的条件,则需要扫描该表

我确实注意到了您的摘要查询中的错误。仅根据您的标签,我认为这些是正确的查询,可以获得给定列别名所需的内容

SELECT COUNT(DISTINCT user_id) as num_users FROM checkin

SELECT COUNT(*) as num_checkins FROM checkin
这是使用InnoDB的另一个原因,当正确配置时,InnoDB有一个数据缓存(InnoDB缓冲池),类似于其他rdbms,如oracle和sql server。MyISAM根本不缓存数据,因此,如果您重复查询可能需要大量IO的相同类型的查询,MySQL将不得不反复执行所有数据读取工作,而使用InnoDB,数据很可能位于缓存内存中,并且返回结果,而不必返回并从存储中读取

主要与次要对比

内部确实没有这样的概念。主键是特殊的,因为它允许数据库查找一行。主键必须是唯一的,为了反映这一点,关联的Btree索引是唯一的,这意味着它不允许索引中存在两个具有相同数据的键

索引是否唯一是一个极好的工具,它允许您在许多其他情况下维护数据库的一致性。假设您有一个带有SS#U Number列的“employee”表来存储社会保险。如果您希望系统支持按SS编号查找员工,那么在该列上设置索引是有意义的。如果没有索引,您将可以。但您还希望该索引是唯一的,这样一旦插入了一个带有SS#的员工,数据库就不会允许您这样做
SELECT COUNT(location_id) as num_users FROM checkin

SELECT COUNT(user_id) as num_checkins FROM checkin
SELECT COUNT(DISTINCT user_id) as num_users FROM checkin

SELECT COUNT(*) as num_checkins FROM checkin