什么';在mySQL查询中使用通配符有什么错?

什么';在mySQL查询中使用通配符有什么错?,mysql,Mysql,基本上,这两个查询在安全性和速度方面有什么不同 SELECT * FROM `myTable` 及 使用*是否会增加我查询的基准,并比静态行执行得慢?从安全角度看,选择的越少,可能会不经意地将不太敏感的数据转储到用户的浏览器中。想象一下,如果*包含列社会安全号,并且在调试代码的某个地方,它会作为HTML注释打印出来 性能方面,在许多情况下,您的数据库位于另一台服务器上,因此当您只需要一小部分数据时请求整行数据意味着通过网络传输的数据要多得多。安全方面,您选择的越少,潜在敏感数据就越不经意地转储

基本上,这两个查询在安全性和速度方面有什么不同

SELECT * FROM `myTable`


使用
*
是否会增加我查询的基准,并比静态行执行得慢?

从安全角度看,选择的越少,可能会不经意地将不太敏感的数据转储到用户的浏览器中。想象一下,如果
*
包含列
社会安全号
,并且在调试代码的某个地方,它会作为HTML注释打印出来


性能方面,在许多情况下,您的数据库位于另一台服务器上,因此当您只需要一小部分数据时请求整行数据意味着通过网络传输的数据要多得多。

安全方面,您选择的越少,潜在敏感数据就越不经意地转储到用户的浏览器中。想象一下,如果
*
包含列
社会安全号
,并且在调试代码的某个地方,它会作为HTML注释打印出来


性能方面,在许多情况下,您的数据库位于另一台服务器上,因此当您只需要一小部分数据时请求整行数据意味着通过网络传输的数据要多得多。

如果您同时单独选择所有列,则性能不会有太大差异

这样做的目的是只选择所需的数据,而不选择更多的数据。如果查询中有大量不需要的列,例如,当您连接多个表时,这可以提高性能


另一方面,当您对表进行更改时,使用*可以简化操作。

如果您同时单独选择所有列,则性能不会有太大差异

这样做的目的是只选择所需的数据,而不选择更多的数据。如果查询中有大量不需要的列,例如,当您连接多个表时,这可以提高性能


Ofc,在硬币的另一面,当你对表格进行更改时,使用*会使生活变得更轻松。

没有一个简单的答案,如果没有更详细的具体表格结构,你的文字问题就无法完全回答,但是我假设您实际上并不是在讨论针对特定表的特定查询,而是显式地选择列或使用
*

SELECT*
总是浪费一些东西,除非您实际上要使用正在读取的行中存在的每一列。。。可能是网络带宽、CPU资源、磁盘I/O或两者的组合,但某些东西被不必要地使用了,尽管这些“东西”可能是非常小且难以察觉的数量。。。或者它可能不是。。。但随着时间的推移,它会累积起来

SELECT*
可能成为性能杀手的地方,我想到的两个大例子是

…具有长
VARCHAR
BLOB
列的表:

诸如
BLOB
VARCHAR
之类的列太长,无法放在B树页面上,它们存储在单独分配的磁盘页面上,称为溢出页面。我们把这样的栏目称为页外栏目。这些列的值存储在溢出页的单链接列表中,每个这样的列都有自己的一个或多个溢出页列表

-

所以,如果
*
包含页面上未存储的列以及行数据的其余部分,那么您只需要在缓冲池中进行I/O操作和/或浪费空间,如果您只选择了所需的内容,就可以避免访问

…还有
SELECT*
阻止查询使用覆盖索引的情况:

如果索引是查询的覆盖索引,并且可以用于满足表中所需的所有数据,则只扫描索引树。在本例中,
Extra
列显示
usingindex
。仅索引扫描通常比所有扫描都快,因为索引的大小通常小于表数据

-

为一个或多个列编制索引时,列数据的副本将存储在索引树中并进行排序,索引树中还包括主键,用于查找行数据的其余部分。从表中选择时,如果您选择的所有列都可以在单个索引中找到,则优化器将自动选择通过直接从索引中读取数据返回给您,而不是花费时间和精力读入所有行数据。。。在某些情况下,这是查询性能上的一个非常显著的差异,因为这意味着资源使用量大大减少

如果与选择
*
时使用的查询计划相比,选择所需的单个列时
解释选择
没有显示完全相同的查询计划,那么您将看到一些相当确凿的证据,表明您选择了不打算使用的内容,从而使服务器承担了不必要的工作

在其他情况下,例如对于
信息\u模式
表,您选择的列可以在性能上产生特别显著的差异。信息模式表实际上不是表——它们是通过SQL接口公开的服务器内部结构。。。而且,您选择的列可以显著地改变查询的性能,因为与其他列相比,服务器需要做更多的工作来计算某些列的值。表也有类似的情况,它们实际上从远程MySQL服务器获取数据,使外部表在逻辑上看起来是本地的。您选择的列实际上是通过网络在服务器之间传输的

显式选择所需的列也可以减少潜在的bug。如果您在代码中使用的列后来从表中删除,那么代码数据结构中的位置(在某些语言中)将包含一个未定义的值,在许多语言中,该值与
SELECT `id`, `name`, `location`, `place` etc... FROM `myTable`