MySQL数据库表优化,以提高查询速度和性能

时间:2019-06-04 13:40:41

标签: mysql database performance primary-key database-indexes

我的MySQL数据库中有2个表。 我们称第一main,第二final

TABLE `main` has the structure         |    TABLE `final` has the structure
                                       |
`id` --> PRIMARY KEY (Auto Increment)  |    `id` --> PRIMARY KEY (Auto Increment)
                                       |    `id_main` -->  ?? (Need help here)
                                       |
id | name    | info                    |     id | id_main | name    | info(changed)
---------------------                  |     ---------------------------------------
1  | Peter   | 5,9                     |     1 |    2     | Butters  | 0.3,34
2  | Butters | 3,3                     |     2 |    4     | Stewie   | 1.2,4.4
3  | Stan    | 2,96                    |     3 |    1     | Peter    | 5.7,0.9
4  | Stewie  | 1,84                    |     4 |    3     | Stan     | 4.8,0.74

分析main中的数据后,结果将放入final中。 如您所见,final有一个额外的列(id_main)指向mainid

实际上这两个表各有1亿多行,执行SQL查询时出现了我的问题。

如何配置final,尤其是{idid_main,以使从mainfinal的查询最快。

我可以取消final.id(PRIMARY KEY,自动递增)并保留吗 final.id_main(作为唯一索引?)

OR

我应该保留id作为主键(AI)和final.id_main作为唯一索引吗?

我会像这样拨打电话

int id_From_Main= 10000;
SELECT `id_main` FROM `final` WHERE `id`='"+id_From_Main+"'

2 个答案:

答案 0 :(得分:0)

如果这些表之间存在1:1的关系,我看不出它们为什么需要两个独立的自动递增主键的原因。

我将删除final.id列,并将final.id_main作为非自动递增的主键,并将其作为main.id列的外键。

通常,您也可以有一个完全没有主键的表。这取决于您是否希望选择特定的单个行。

我不理解您的查询SELECT id_main FROM final WHERE id = '"+id_From_Main+"' -您正尝试通过main中的ID选择main中ID的值。目的是什么,为什么要尝试获得已经拥有的价值?

无论如何,您提供的信息不足以提供合格的答案。您必须根据要执行的查询来优化数据结构。

确保在WHERE子句中使用的列上有索引。如果按final.id_main选择,则在该列上有一个索引。如果按final.id_mainfinal.name进行选择,则两列均应有一个复合索引,等等。

两个表中是否确实需要name列?除非进行一些性能优化(以避免连接),否则这是一个不好的数据库设计。

因此,您应该:

  1. 收集您当前正在使用的所有查询,并根据它们设置适当的索引
  2. 删除所有不必要的列(例如final.idfinal.name
  3. 在查询中使用EXPLAIN获取执行信息(也可以使用Explain analyzer帮助您解释结果)
  4. 您可以尝试query profiling

答案 1 :(得分:-1)

在mysql中,您必须将id定义为PK,因为它是auto_increment。将id_main定义为UNIQUE。