Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 500000用户数据库速度相当慢_Mysql_Database_Performance_Optimization - Fatal编程技术网

Mysql 500000用户数据库速度相当慢

Mysql 500000用户数据库速度相当慢,mysql,database,performance,optimization,Mysql,Database,Performance,Optimization,我有一个具有以下结构的数据库: username,email,ip,hash,salt 目前,我们在该数据库中有大约60万用户。 用户抱怨查询这个数据库相当慢 在我们的测试中,我们发现检索用户记录大约需要1.15秒。 此测试基于以下查询: SELECT * FROM users WHERE email = 'test@mail.com' 我不是数据库管理方面的专家。当我像使用字典一样使用它时,我知道如何应付,但是我对数据库优化一无所知 我希望能得到一些帮助。理想情况下,我们能够在不到一秒钟的

我有一个具有以下结构的数据库:

username,email,ip,hash,salt
目前,我们在该数据库中有大约60万用户。 用户抱怨查询这个数据库相当慢

在我们的测试中,我们发现检索用户记录大约需要1.15秒。 此测试基于以下查询:

SELECT * FROM users WHERE email = 'test@mail.com'
我不是数据库管理方面的专家。当我像使用字典一样使用它时,我知道如何应付,但是我对数据库优化一无所知

我希望能得到一些帮助。理想情况下,我们能够在不到一秒钟的时间内对1000万用户查询这样的数据库


有人对优化这样的简单查询有什么建议吗?我现在对任何事情都持开放态度,如果有更合乎逻辑的方法,甚至可以重构数据库。因为现在,它们只是按照注册的顺序排序。

您可以添加注释中已经提到的索引,但有一个想法出现了——您当前正在检索该行的所有信息——将查询的目标定位为只检索必要的信息会更有效,例如

SELECT username FROM users WHERE email = 'test@mail.com';

此外-您应该调查PDO和绑定参数的安全性。

您可以添加注释中已经提到的索引,但有一个想法出现了——您当前正在检索该行的所有信息——将查询定位为只检索必要的信息会更有效,例如

SELECT username FROM users WHERE email = 'test@mail.com';

此外,您还应该研究PDO和绑定参数的安全性。

MySQL有两个重要的功能来提高性能。对于您的查询类型,500000行或10000000行并不是什么大问题。尽管NOSQL等其他技术可以执行相同的操作,但像您这样的应用程序通常依赖于数据库的ACID属性。关系数据库可能是正确的解决方案

正如其他地方提到的,第一个工具是索引。就你而言:

create index idx_users_email on users(email);
索引将为
insert
delete
操作带来非常小的开销。然而,使用索引,即使是并发查询,查找一行的时间也应该少于0.1秒

根据您正在运行的其他查询,可能需要使用其他索引


第二个重要功能是对表进行分区。这对于
用户
表不是必需的。但是,它对于事务和其他类型的数据非常有用。

MySQL有两个重要的功能来提高性能。对于您的查询类型,500000行或10000000行并不是什么大问题。尽管NOSQL等其他技术可以执行相同的操作,但像您这样的应用程序通常依赖于数据库的ACID属性。关系数据库可能是正确的解决方案

正如其他地方提到的,第一个工具是索引。就你而言:

create index idx_users_email on users(email);
索引将为
insert
delete
操作带来非常小的开销。然而,使用索引,即使是并发查询,查找一行的时间也应该少于0.1秒

根据您正在运行的其他查询,可能需要使用其他索引



第二个重要功能是对表进行分区。这对于
用户
表不是必需的。但是,它对交易和其他类型的数据非常有用。

电子邮件上添加索引
也在
用户名上添加索引
我假设互联网上有关于“索引”功能的资源。我假设它不仅仅是在列旁边添加一个数字。我马上回来报告。谢谢大家。索引确实会有帮助。当数据库引擎必须遍历所有记录时,Fullscan搜索会使其速度变慢。拥有索引是在排序结构中进行搜索的一种很好的方法,它的速度要快很多倍。在像您这样的情况下,这是一种标准的推荐方法。在这种情况下,您应该使用参数化查询。没有必要每次都创建执行计划。在
电子邮件上添加索引
也在
用户名上添加索引
我假设互联网上有关于“索引”功能的资源。我假设它不仅仅是在列旁边添加一个数字。我马上回来报告。谢谢大家。索引确实会有帮助。当数据库引擎必须遍历所有记录时,Fullscan搜索会使其速度变慢。拥有索引是在排序结构中进行搜索的一种很好的方法,它的速度要快很多倍。在像您这样的情况下,这是一种标准的推荐方法。在这种情况下,您应该使用参数化查询。没有必要每次都创建执行计划。ALTER TABLE
users
ADD INDEX
email
email
)给了我一个错误。我需要索引多少字节?@user292010什么错误?请出示。我刚刚试过Gordon's and your way的一个1000万行的样本表。这两种方法都有效,并且都将选择时间(在我的例子中)从~3.5秒减少到了0.00秒,即MySQL甚至无法测量:-)@PerlDog,如果
email
是文本列(并且不应该),则需要为索引指定键长度。顺便说一句:
email
应该是唯一的。@PaulSpiegel啊,好吧,我不知道,但假设是[var]char。我对文本和blob不太熟悉(只使用过一次,但没有真正的用例)。如果你让电子邮件独一无二,你就不需要在电子邮件上显式地创建(另一个)索引。唯一约束自行生成索引。ALTER TABLE
users
ADD index
email
email
)给了我一个错误。我需要索引多少字节?@user292010什么错误?请出示。我刚刚试过Gordon's and your way的一个1000万行的样本表。这两种方法都有效,并且都将选择时间(在我的例子中)从~3.5秒减少到了0.00秒,即MySQL甚至无法测量:-)@PerlDog,如果
email
是一个文本列(并且不应该),则需要指定