Mysql使用tenant_id进行复合索引

2024-04-28

我们有一个多租户应用程序,该应用程序有一个包含 129 个字段的表,这些字段都可以在 WHERE 和 ORDER BY 子句中使用。我花了 5 天的时间试图找出最适合我们的索引策略,我获得了很多知识,但我仍然有一些问题。

1)创建索引时,我应该始终将其设为首先带有tenant_id的复合索引吗?(所有查询在WHERE子句中都有tenant_id = ?)

2)由于所有列都可以在 WHERE 子句和 order by 子句中使用,我应该为它们创建索引吗? (正确的知道,当我按没有索引的列进行排序时,对于大约有 1,500,000 行的租户,执行需要 6 秒)

3)创建PK(tenant_id,ID),但这不会影响到该表的连接吗?

任何有关如何处理此问题的建议将不胜感激。

====== 数据库引擎是InnoDB

=======

结构 :

ID bigint(20) auto_increment primary
tenant_id int(11)
created_by int(11)
created_on Timestamp
updated_by int(11)
updated_on Timestamp
owner_id int(11)
first_name VARCHAR(60)
last_name VARCHAR(60)
.
.
.
(some 120 other columns that are all searchable)

对问题的一些简短回答。据我所知,您对使用感到困惑indexes

如果比率 - 则考虑在列上创建索引

Consideration 1 -

(列的唯一条目数)/(列中的总条目数)~= 1

即特定列中不同行的计数较高。

创建一个extra index总是会给 MySQL 服务器带来开销,所以你MUST NOT创建每一列index. 单个表可以拥有的索引数量也有限制 = 每个表 64 个


现在如果你的tenant_id存在于所有搜索查询中,您应该将其视为index或在一个composite key,

前提是——

Consideration 2- 数量UPDATEs少于该数量SELECTs on the tenant_id


Consideration 3 - The indexes 应尽可能小data types. You MUST NOT创建一个varchar 64一个索引
http://www.mysqlperformanceblog.com/2012/08/16/mysql-indexing-best-practices-webinar-questions-followup/ http://www.mysqlperformanceblog.com/2012/08/16/mysql-indexing-best-practices-webinar-questions-followup/


Point to Note 1- 即使您确实将任何列声明为索引,MySQL 优化器可能仍然不会将其视为查询执行的最佳计划。所以总是使用EXPLAIN知道发生了什么事。http://www.mysqlperformanceblog.com/2009/09/12/3-ways-mysql-uses-indexes/ http://www.mysqlperformanceblog.com/2009/09/12/3-ways-mysql-uses-indexes/


Point to Note 2- 你可能想要cache您的搜索查询,因此请记住不要在您的搜索中使用不可预测的语句SELECT查询,例如NOW()

最后 - 进行 PK (tenant_id, ID) 不应影响表上的连接。
还有一个很棒的链接可以回答您所有的一般问题 -http://www.percona.com/files/presentations/WEBINAR-MySQL-Indexing-Best-Practices.pdf http://www.percona.com/files/presentations/WEBINAR-MySQL-Indexing-Best-Practices.pdf

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mysql使用tenant_id进行复合索引 的相关文章

  • java.sql.SQLException:在结果集开始之前[重复]

    这个问题在这里已经有答案了 我已尝试使用以下代码来检索存储在数据库中的图像 我创建了一个名为image db包含一个名为的表image details 该表有两个字段 id and image path两者都是类型mediumblob 我在
  • 如何更改Mysql的连接排序规则

    如何更改 mysql 数据库的连接排序规则 我在 ubuntu 14 中使用 Mysql workbench 5 5 和 mysql 5 5 当我执行存储过程时 出现错误 错误代码 1267 操作 的排序规则 utf8 general ci
  • jQuery Cycle 插件 - 如何返回当前显示幻灯片的索引号?

    我目前正在使用Malsup 的 Cycle 插件 http jquery malsup com 我只是想知道是否可以让循环插件返回当前显示幻灯片的索引号 我想在特定幻灯片处于活动状态时更改页面内容 不知道如何实现这一点 你可以这样做 on
  • 查询查找表中姓名和号码之间的重复项

    SELECT count lower name number FROM tbl GROUP BY lower name number HAVING count gt 1 输入表1 slno name number 1 aaa 111 2 A
  • MYSQL数据库删除行后需要进行后期优化

    我有一个当前为 10GB 的日志表 它有很多过去两年的数据 我真的觉得目前我不需要那么多 我是否错误地认为在表中保存多年的数据不好 表越小越好 我的桌子都有 MYISAM 引擎 我想删除 2014 年和 2015 年的所有数据 很快我就会删
  • MySQL 连接逗号分隔字段

    我有两张桌子 第一个表是batch在字段 batch 中包含逗号分隔的学生 ID 的表 batch id batch 1 1 2 2 3 4 第二个表是分数 marks id studentid subject marks 1 1 Engl
  • 通过“SELECT”命令选择每组的前两条记录的最佳方法是什么?

    例如我有下表 id group data 1 1 aaa 2 1 aaa 3 2 aaa 4 2 aaa 5 2 aaa 6 3 aaa 7 3 aaa 8 3 aaa 通过 SELECT 命令选择每组的前两条记录的最佳方法是什么 如果没有
  • SQL查询:按字符长度排序?

    是否可以按字符总数对sql数据行进行排序 e g SELECT FROM database ORDER BY data length 我想你想用这个 http dev mysql com doc refman 5 0 en string f
  • Python错误代码:IndexError:索引错误列表索引超出范围

    我正在尝试用 Python 编写一个模拟赛马的函数 虽然没有获胜者 但它会清除屏幕 显示马匹列表 所有马匹的索引都从零开始 然后 在我标记的行上 代码变得混乱 我发现索引错误列表超出范围 我正在尝试随机选择一匹马 随机选择一个索引号 并将该
  • django.core.exceptions.ImproperlyConfigured:加载 MySQLdb 模块时出错:没有名为 MySQLdb 的模块

    我在尝试连接 mysql 数据库时遇到的问题 我还给出了我使用过的数据库设置 Traceback most recent call last File manage py line 10 in
  • 编写多个mysql脚本

    是否可以在复合脚本中包含其他 mysql 脚本 理想情况下 我不想为包含的脚本创建存储过程 对于较大的项目 我想分层维护几个较小的脚本 然后根据需要组合它们 但现在 我很乐意学习如何包含其他脚本 source是一个内置命令 您可以在 MyS
  • 获取MySql中重复行的列表

    我有一张这样的桌子 ID nachname vorname 1 john doe 2 john doe 3 jim doe 4 Michael Knight 我需要一个查询 该查询将从具有相同 nachname 和 vorname 的记录
  • 如何在pandas中将字符串转换为没有日期的日期时间

    例如issue d数据框中的列是字符串 df issue d Dec 2012 我想将字符串转换为日期时间类型而不是字符串类型 2012 12 怎么做 I use datetime strptime x b Y for x in df is
  • 澄清创建临时表的连接顺序

    我在 mysql 中有一个大型查询 涉及将多个表连接在一起 它太慢了 所以我做了 解释 发现它正在创建一个临时表 我怀疑它占用了大部分执行时间 我找到了一些相关资料 mysql 文档 http dev mysql com doc refma
  • MySQL:用户对数据库的访问被拒绝

    我正在尝试在 Heroku 上的远程 SQL 服务器上创建一个数据库 clearDB 我与此联系 mysql host lt
  • 如何在 MySql Workbench 中禁用 INVISIBLE 索引选项?

    我刚刚安装了MySqlWorkbench我发现了实施INVISIBLE index所描述的here https dev mysql com doc refman 8 0 en invisible indexes html 我想禁用此功能 因
  • 为通用字符选择表排序规则

    我正在开发一个需要存储通用字符的后端 我选择了utf8mb4用于此目的的表编码 我还必须选择表格排序规则 最直接的选择是选择utf8mb4 general ci表整理 除了一般的排序规则之外 还有大约20种其他排序规则可供选择 更具体的排序
  • 使用单个查询和每用户密码盐进行用户登录

    我决定使用存储在数据库中的每用户盐来实现用户登录 盐作为密码的前缀 该密码使用 SHA 进行哈希处理并存储在数据库中 过去 当我不使用盐时 我会使用典型的方法 使用用户输入的用户名和密码来计算查询返回的行数 然而 对于每个用户的盐 您需要先
  • MySQL 如何使用返回多行的 SELECT 子查询插入表?

    MySQL 如何使用返回多行的 SELECT 子查询插入表 INSERT INTO Results People names VALUES SELECT d id FROM Names f JOIN People d ON d id f i
  • 自定义 php 论坛 - 显示新的/未读的帖子

    我自己使用 php 编写了一个自定义论坛脚本 我决定不使用 phpbb 和其他工具 因为我希望我所做的事情具有 100 的灵活性 不过我遇到了一个问题 如何向用户显示帖子是否是新的 未读的 我想到了两种解决方案 1 饼干 2 数据库 我不想

随机推荐