MYSQL数据库规范化&;查询索引
我们目前有一个包含90列的表,随着表的增长和业务需求的变化,我们不得不大量修改表(添加/删除cols和索引) 对于该应用程序,我们的工作人员不断查询上述数据的各种变化,例如已完成(已完成)、已检查(管理员检查)和未删除、已审核(已删除、已审核) 我们认为将其中一些列卸载到它们自己的行中可能更容易,我们将其称为quotes\u actions,然后在查询时执行一些连接MYSQL数据库规范化&;查询索引,mysql,indexing,database-normalization,Mysql,Indexing,Database Normalization,我们目前有一个包含90列的表,随着表的增长和业务需求的变化,我们不得不大量修改表(添加/删除cols和索引) 对于该应用程序,我们的工作人员不断查询上述数据的各种变化,例如已完成(已完成)、已检查(管理员检查)和未删除、已审核(已删除、已审核) 我们认为将其中一些列卸载到它们自己的行中可能更容易,我们将其称为quotes\u actions,然后在查询时执行一些连接 |------ (Table name: quotes_actions) |Column|Type|Null|Default |
|------ (Table name: quotes_actions)
|Column|Type|Null|Default
|------
|//**id**//|int(11)|No|
|quote_id|int(11)|No|
|action|varchar(100)|No|
|user_id|int(11)|No|
|time|datetime|Yes|NULL
|created_at|datetime|Yes|NULL
例如,action='completed'使用字段,索引包括quote_id和action
我们已经将150000行的数据拆分成这种格式,它既不比使用正确的索引查询原始数据库快也不比查询慢
有没有人对此有经验,对每种方法都有什么建议或缺陷?添加覆盖索引和按需要向原始表中添加列需要花费大量时间,而第二种方法将索引设置就绪,但会引入更多的联接和更复杂的查询
0.09s
select * from `quotes`
where `completed_at` is not null
and `approved_at` is not null
and deleted_at is null
=>
此外,如果第二种方法更好,如果报价未被批准,如何查询负面结果 数据库设计因应用程序而异,对于一个实现来说很好的东西对于另一个实现来说很糟糕。您已经确定了一些对您很重要的事情:
- 数据访问速度(至少不会降低当前性能)
- 能够响应应用程序需求/更改
- 限制查询的复杂性
select quote_id from quotes_action where quote_id not in
(select quote_id from quotes_action where action = 'approved');
最后的想法
您需要与您的团队坐下来讨论您希望如何推进此产品。花几天或几周的时间认真思考。集思广益……黑客大会……做点什么来找到你喜欢的解决方案,让你的产品更好、更易维护。我们都曾遇到过这样的情况:我们有一个无法维护的产品,该产品本可以在某个时候修复,但却超出了这一点。尽量不要达到这一点,并在有机会的时候修复它。数据库设计因应用程序而异,对一个实现来说很好的东西对另一个实现来说很糟糕。您已经确定了一些对您很重要的事情:
0.0005s
select * from `quotes_new`
inner join quotes_actions as q1 on q1.action = 'completed' and q1.quote_id = quotes_new.id
inner join quotes_actions as q2 on q2.action = 'approved' and q2.quote_id = quotes_new.id
where quotes_new.deleted_at is null
select quote_id from quotes_action where quote_id not in
(select quote_id from quotes_action where action = 'approved');