- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在寻求有关如何考虑对同一列集执行不同查询组合的表所需的最少索引数的指导。理想情况下,您的答案将从这个特定示例中抽象出一些经验法则(如果可能的话)。
此项目符号列表代表三种通常在我的表上执行的不同查询条件:
注:user_id(int), race_type(varchar), recordable_id(int), recordable_type(varchar), active(boolean)
我可以为其中的每一个创建单独的多列索引,但是你们这些数据库性能专家可能会采用不同的方法。
如果我需要提供更多信息以获得最佳答案,请告诉我。
最佳答案
如果您的条件是分层的(如您的示例),您可以使用组合索引。 DBMS 无法同时处理多个索引。尽管这是可能的,并且他们会尽力从这种情况中获得最大 yield 。
这不会改变您应该尝试为某个 where 子句创建特定索引的事实。如果可以将更多 WHERE 的索引组合成一个索引,那么您可以释放一些空间和 CPU 周期。
让我们从为每个 WHERE 指定一个索引开始:
index1 (race_type, recordable_type, active)
index2 (race_type, recordable_id, recordable_type, active)
index3 (user_id, race_type, recordable_id, recordable_type, active)
一般来说,您可以通过提升基数来优化您的订单。基数是列在您的数据集中可能具有的值的数量。在你的例子中 active
是一个 bool 值。 (请注意,boolean
只能有两个值这一事实并不重要。它可能是 int
如果您知道它只有两个值:0 和 1)。
您的 active
的基数较低field 意味着通过一次查找,我们可以消除一半可能的记录(当然取决于您的数据集)。完成此步骤后,您的第一个索引将如下所示:
index1 (active, race_type, recordable_type)
除了基数之外,您还应该注意字段之间的任何逻辑层次结构。在不知道这些名称的确切含义的情况下,我根据经验推测某些种族将有他们自己的记录。 - 当然,这不会消除可记录用于多种比赛类型的可能性,但您必须选择一个顺序,这似乎是更合乎逻辑的顺序。 - 所以我们将使用 race_type
, recordable_type
订单。
现在让我们看一下第二个索引。你介绍了recordable_id
这里。在不知道您的数据集的情况下,我可以放心地假设 recordable_id 的基数将大于 recordable_type 的基数。换句话说,id 的数量将多于类型。我还怀疑 type 和 id 之间存在层次结构(闻起来像一对多)。所以让我们把它放在像这样的类型之后:
index2 (active, race_type, recordable_type, recordable_id)
现在是时候关注另一个重要的角度了。当修改您的数据库时,索引在您的 HDD 上有自己的成本(基本上是免费的)和 CPU 周期。任何索引的子集都可以从左到右使用。 index2
基本上包含 index1
因为它是index1 + recordable_id
, 所以你可以去掉它,最后得到一个。
随之而来user_id
.作为 ID 字段,它表示高基数(许多可能的值),但请注意,不是规则“基数越高,越晚提交”。我们宁愿使用基数作为灯塔来帮助发现字段之间类似层次结构的关系。 (并缩小索引大小)。
是否 user_id
指向我们正在查看数据的个人参赛者(许多可能性)?还是客户端上传了数据(可能性很小)?这很难说。您可以将其附加到我们现有的 index2
你最终会得到一个可以在所有三个场景中使用的索引:
search_index (active, race_type, recordable_type, recordable_id, user_id)
...或者可能值得为此 scanario 添加第二个索引...
你的问题很特别,因为你只用了=
在你的 where 子句中。如果您有类似 AND (race_type = 1 OR race_type=8)
的内容,还有许多其他注意事项更不用说>
或 <
.另外,如果您使用 ORDER BY
可以将其纳入您使用的索引中。
关于mysql - 数据库索引用于同一组列的多个查询组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7860678/
我的问题是如何在 python 中创建一个简单的数据库。我的例子是: User = { 'Name' : {'Firstname', 'Lastname'}, 'Address' : {'Street
我需要创建一个与远程数据库链接的应用程序! mysql 是最好的解决方案吗? Sqlite 是唯一的本地解决方案吗? 我使用下面的方法,我想知道它是否是最好的方法! NSString *evento
给定两台 MySQL 服务器,一台本地,一台远程。两者都有一个包含表 bohica 的数据库 foobar。本地服务器定义了用户 'myadmin'@'%' 和 'myadmin'@'localhos
我有以下灵活的搜索查询 Select {vt:code},{vt:productcode},{vw:code},{vw:productcode} from {abcd AS vt JOIN wxyz
好吧,我的电脑开始运行有点缓慢,所以我重置了 Windows,保留了我的文件。因为我的大脑还没有打开,所以我忘记事先备份我的 MySQL 数据库。我仍然拥有所有原始文件,因此我实际上仍然拥有数据库,但
如何将我的 Access 数据库 (.accdb) 转换为 SQLite 数据库 (.sqlite)? 请,任何帮助将不胜感激。 最佳答案 1)如果要转换 db 的结构,则应使用任何 DB 建模工具:
系统检查发现了一些问题: 警告:?:(mysql.W002)未为数据库连接“默认”设置 MySQL 严格模式 提示:MySQL 的严格模式通过将警告升级为错误来修复 MySQL 中的许多数据完整性问题
系统检查发现了一些问题: 警告:?:(mysql.W002)未为数据库连接“默认”设置 MySQL 严格模式 提示:MySQL 的严格模式通过将警告升级为错误来修复 MySQL 中的许多数据完整性问题
我想在相同的 phonegap 应用程序中使用 android 数据库。 更多说明: 我创建了 phonegap 应用程序,但 phonegap 应用程序不支持服务,所以我们已经在 java 中为 a
Time Tracker function clock() { var mytime = new Date(); var seconds
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
我有一个可以收集和显示各种测量值的产品(不会详细介绍)。正如人们所期望的那样,显示部分是一个数据库+建立在其之上的网站(使用 Symfony)。 但是,我们可能还会创建一个 API 来向第三方公开数据
我们将 SQL Server 从 Azure VM 迁移到 Azure SQL 数据库。 Azure VM 为 DS2_V2、2 核、7GB RAM、最大 6400 IOPS Azure SQL 数据
我正在开发一个使用 MongoDB 数据库的程序,但我想问在通过 Java 执行 SQL 时是否可以使用内部数据库进行测试,例如 H2? 最佳答案 你可以尝试使用Testcontainers Test
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 9 年前。 此问题似乎与 a specific programming problem, a sof
我正在尝试使用 MSI 身份验证(无需用户名和密码)从 Azure 机器学习服务连接 Azure SQL 数据库。 我正在尝试在 Azure 机器学习服务上建立机器学习模型,目的是我需要数据,这就是我
我在我的 MySQL 数据库中使用这个查询来查找 my_column 不为空的所有行: SELECT * FROM my_table WHERE my_column != ""; 不幸的是,许多行在
我有那个基地:http://sqlfiddle.com/#!2/e5a24/2这是 WordPress 默认模式的简写。我已经删除了该示例不需要的字段。 如您所见,我的结果是“类别 1”的两倍。我喜欢
我有一张这样的 table : mysql> select * from users; +--------+----------+------------+-----------+ | userid
我有表: CREATE TABLE IF NOT EXISTS `category` ( `id` int(11) NOT NULL, `name` varchar(255) NOT NULL
我是一名优秀的程序员,十分优秀!