在mysql中调用大量字段时最好使用*?

在mysql中调用大量字段时最好使用*?,sql,mysql,database,Sql,Mysql,Database,我知道,一般来说,构建mysql查询来命名您需要的每一项都会有更好的性能,但例如,在配置文件页面上,我可能需要除少数之外的每一项 SELECT user_name,f_name,l_name,country,usa_state,other_state,zip_code,city,gender,birth_date,date_created,date_last_visit, user_role,photo_url,user_status,friend_count,comment_coun

我知道,一般来说,构建mysql查询来命名您需要的每一项都会有更好的性能,但例如,在配置文件页面上,我可能需要除少数之外的每一项

    SELECT user_name,f_name,l_name,country,usa_state,other_state,zip_code,city,gender,birth_date,date_created,date_last_visit, 
user_role,photo_url,user_status,friend_count,comment_count,forum_post_count,referral_count,referral_count_total, 
setting_public_profile,setting_online,profile_purpose,profile_height,profile_body_type,profile_ethnicity, profile_occupation,profile_marital_status,profile_sex_orientation,profile_home_town,profile_religion, 
profile_smoker,profile_drinker,profile_kids,profile_education,profile_income,profile_headline,profile_about_me, 
profile_like_to_meet,profile_interest,profile_music,profile_television,profile_books,profile_heroes,profile_here_for,profile_counter FROM users WHERE user_id=1 AND user_role >
因此,如果不做一系列测试,也许有更多经验的人可以提出一些建议

这会更糟吗

SELECT * FROM users WHERE user_id=1 AND user_role >

我更喜欢列出所有项目,因为在该页面上,如果我需要数据库中的某些内容,可以很容易地看到我可用的内容,但如果速度更快,则我不会列出它们。

注意:命名所有字段当然是最佳做法,但在本文中,我将只讨论性能优势,不是设计或维护


*
语法可能较慢,原因如下:

  • 并非所有字段都已编制索引,查询使用完整表扫描。可能不是您的情况:您返回的所有字段几乎不可能使用单个索引进行索引

  • 从包含可变长度列的表返回尾部字段可能会导致轻微的搜索开销:要返回
    20th
    字段,应检查先前的
    19
    ,并计算偏移量

  • 只需要返回更多数据(通过连接传递)

由于您几乎需要所有字段,最后一个原因可能是最重要的原因。比如说,
description TEXT
字段只能是页面上未使用的
50个
字段中的
1个
,但可以占用所有其他字段的10倍空间


在这种情况下,最好命名所有字段并省略不需要的长字段。

您应该始终指定所需的列,除非您的编程语言支持关联列表/数组,以便可以按名称检索名称


如果你需要用索引号来重命名它,那么如果你在表中的任何地方插入一个新的列,那么使用<代码> */C>可能会带来一个巨大的问题,因为所有的索引从那个点都会增加一个…

当考虑使用*时,你应该总是考虑稍后会有更多的字段添加到表中的可能性。 如果有更多的字段,那么最终检索和返回的数据可能会超过您的需要

您可能对某些新字段有问题。例如,如果您只是在字段中循环并显示它们,则可能有不想显示的新字段。或者,数据类型可能需要先进行一些格式化


也有可能从表中删除字段,例如在规范化表时。在这种情况下,期望某个特定字段的代码可能会中断。

但如果需要表中的所有字段,该怎么办?当然,您应该选择所有字段
MySQL
将在内部将
*
扩展到字段的完整列表中,不会有任何性能差异。@关于第一点,我不太理解select表达式(在本例中为
*
)如何影响索引的使用。据我所知,如果
其中
条件与索引属性一起工作,那么相应的索引将用于查找满足该条件的记录。找到记录后,RDBMS将加载select表达式所需的属性。从这个角度来看,索引的使用不应该依赖于一组加载的属性。@Mr.Deathless:如果您选择的所有字段(以及筛选的字段)都包含在索引中,RDBMS就不需要在表本身中查找它们。