mysql快速选择查询,无需读取所有数据库
我有一个包含两个表的大型数据库:stat和total 该关系的示例如下所示: 统计: 总数: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查询,系统的速度会非常
|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" |