mysql SELECT QUERY在小型和大型数据库中使用索引[已关闭]

k3bvogb1  于 2022-11-21  发布在  Mysql
关注(0)|答案(2)|浏览(122)

已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新问题,以便editing this post可以用事实与引用来回答.

2天前关闭。
Improve this question
我有两种不同的情况,在smallDB中有200行(如此简单),在largeDB中有2,000,000,000行(每天添加更多行),我想选择一行或多行,在这种情况下,哪一种是更好的选择查询?
示例表:
| 识别码|代码|x键|组群|姓名|标题|其他列|
| - -|- -|- -|- -|- -|- -|- -|
| 一个|AA公司|AK 32 d型|g1级|一个人。|一个人。|一个人。|
| 二百|zz| zgi32|五代|一个人。|一个人。|一个人。|

ID:主要代码:索引(非复合索引)x_Key:指数(非综合指数):例如G5组中20%的行

例如,对于小型和大型数据库,这是同一个表,哪个QUERY更适合选择一行或多行?(问号表示我将搜索值放在查询中)
在小型数据库中,需要一行:

SELECT name,title FROM table WHERE code=?
SELECT name,title FROM table WHERE code=? AND x_key=?
SELECT name,title FROM table WHERE code=? AND x_key=? AND group=?
SELECT name,title FROM table WHERE code=? LIMIT 1
SELECT name,title FROM table WHERE code=? AND x_key=? LIMIT 1
SELECT name,title FROM table WHERE code=? AND x_key=? AND group=? LIMIT 1

在小型数据库中,需要多行:

SELECT name,title FROM table WHERE group=?
SELECT name,title FROM table WHERE group=? AND name LIKE `%test`

&&
在大型数据库中,需要一行:

SELECT name,title FROM table WHERE code=?
SELECT name,title FROM table WHERE code=? AND x_key=?
SELECT name,title FROM table WHERE code=? AND x_key=? AND group=?
SELECT name,title FROM table WHERE code=? LIMIT 1
SELECT name,title FROM table WHERE code=? AND x_key=? LIMIT 1
SELECT name,title FROM table WHERE code=? AND x_key=? AND group=? LIMIT 1

在大型数据库中,需要多行:

SELECT name,title FROM table WHERE group=?
SELECT name,title FROM table WHERE group=? AND name LIKE `%test`

在小型和大型中,哪一个更适合SELECT,甚至UPDATE?

zaqlnxep

zaqlnxep1#

你说“需要一行”--你的意思是“只返回一行”吗?还是“我只需要其中一行,任何一行都足够了”?还是“我只需要按某种顺序的第一行”?
拥有这两个“复合”索引将有助于您提到的所有查询。

INDEX(code, x_key, group)
INDEX(group, name)

如果这两个组合中有一个是唯一的,则考虑将其设为PRIMARY KEY并去掉ID。这将进一步加快某些查询的速度。您是在暗示code,* 本身 * 就是UNIQUE。在这种情况下,去掉ID并只使用

PRIMARY KEY(code),
 INDEX(group, name)

特别是,我之前的3列建议不值得拥有。
在209行的测试用例中,您可能很难衡量任何改进,但是更大的表(甚至是2B行的表)将从中受益。
单行索引也可以是DROP。
如果只有一行,则LIMIT 1是无用;如果有多行,请注意,如果没有ORDER BY,您将得到优化器想要给您的任何一行。
添加一个ORDER BY需要重新开始索引设计。
以上所有这些也适用于UPDATE。但是,如果您需要一次更新几百行以上的行,则会出现其他问题。

hi3rlvi2

hi3rlvi22#

首先,使用LIMIT 1语句/部分的查询速度更快。

但不要忘记ORDER BY,否则MySQL将选择返回哪个子集(如注解中所述)。

查询的其余部分的速度取决于哪些列被配置为索引。
如果所有的查询都被索引(或者至少是那些被访问的查询),那么使用PHP进行过滤的速度会更慢,因此使用大多数条件的查询速度会更快。

但是如果code列为unique,则不检查其余列的速度最快:

SELECT name, title FROM table WHERE code=?

您可以这样想,如果任何列是unique,则仅为该列设置条件。

相关问题