mysql快速选择查询,无需读取所有数据库

mysql快速选择查询,无需读取所有数据库,mysql,database,select,Mysql,Database,Select,我有一个包含两个表的大型数据库:stat和total 该关系的示例如下所示: 统计: 总数: |ID | Event | +---+--------------+ | 7 | "hello" | | 7 | "everybody" | | 8 | "hi" | 这是一个非常简化的版本;还考虑STAT表可以有500 K记录,对于每个STAT,我可以有大约200个总行。< /P> 目前,如果我在TOTAL表中运行一个简单的SELECT查询,系统的速度会非常

我有一个包含两个表的大型数据库:stat和total

该关系的示例如下所示:

统计:

总数:

|ID | Event        |
+---+--------------+
| 7 | "hello"      |
| 7 | "everybody"  |
| 8 | "hi"         |
这是一个非常简化的版本;还考虑STAT表可以有500 K记录,对于每个STAT,我可以有大约200个总行。< /P> 目前,如果我在TOTAL表中运行一个简单的
SELECT
查询,系统的速度会非常慢


有人能帮我提供一些关于创建TOTAL表的建议吗?是否可以对MySQL说,
id
列已经排序,因此没有理由扫描所有行,直到最后,例如,
id=7

您可以添加索引,并且可以对表进行分区

  • 如果尚未将
    索引(ID)
    添加到表中(两者)

  • 从总数中选择COUNT(*),其中ID=7
    ->如果索引了
    ID
    ,这将非常快


  • 根据@ypercube的注释,表不是以排序状态存储的,因此不能向数据库“告知”这一点。但是,您可以在表上添加索引,以加快搜索速度

    需要检查的一件重要事情是,
    TOTAL.ID
    看起来像是外键,如果是,表
    TOTAL
    应该有一个名为
    ID
    的主键。将该名称的现有列重命名为
    STAT\u ID
    ,因此很明显它是外键。然后在
    STAT\u ID
    上添加索引


    最后,作为一种风格,我建议您使表名和列名不区分大小写,并用小写字母书写。当关键字为大写,数据库对象为小写时,可以更轻松地读取SQL。

    此处的ID is key是主键,并且已自动进行了修改indexed@SashiKant:
    TOTAL(ID)
    不是唯一的,因此它不能是主键。在“从TOTAL中选择COUNT(*),其中ID=7->如果ID被索引,这将很快”,您正在考虑ID,这是一个根本没有能力的主要问题。您可以很容易地从问题中理解:D但是如果我为列编制索引,我可以有重复的吗?而且。。如果我要执行一个select WHERE event='xxx'怎么办?相同的慢速搜索权限?@user1083700如果键不是
    PRIMARY
    UNIQUE
    (常规索引没有添加唯一性约束),则可以有重复项,然后如果我执行分区,我还应该添加另一个具有映射权限的表?通过映射,我打算:在分区号1中,我的ID从1到10,例如..不..有大量数据的表,你可以将其划分为小块,但请记住,你要对表进行分区的列应该始终位于该表上每个查询的where子句中的一个子句中。否则它会扫描所有分区。如果一百万条记录可能还太早,我想。等到你有1000万条记录时再进行分区。
    :)
    好吧,我想我会达到900万条记录,所以“进一步”的想法很受欢迎。^^^@SashiKant:当然,但对于初学者来说,未来主义毫无必要地让事情复杂化。只需从索引和主键开始!简要地说,您运行此数据库的硬件是什么?如果它是一个共享的LinuxWeb服务器,那么可能是时候升级了!目前正在PC上运行。数据库是运行LocalRight的程序的输出。请记住,与作为服务器设置的类似硬件相比,桌面硬件上的数据库的性能往往非常差。(旁注:陈述操作系统、CPU和RAM的详细信息有助于回答此类问题,以便让读者了解您的机器规格——尽管在这种情况下,这并不太重要!)。
    |ID | Event        |
    +---+--------------+
    | 7 | "hello"      |
    | 7 | "everybody"  |
    | 8 | "hi"         |