select* from table的弊端

这里是修真院后端小课堂,每篇分享文从

【select* from table的弊端 】

大家好,我是IT修真院上海分院,一枚正直纯洁善良的如刚入门的Java程序员,今天试着给大家分享一下Select*from table的弊端
sql执行流程机制:

1.客户端发送一条查询给服务器。

2.服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段。

3。服务器端进行SQL解析,预处理,再由优化器生成对应的执行计划

4。MySql根据优化器生成的执行计划,调用存储引擎的API执行查询。

5。返回结果给客户端。

具体用法:

– 检索单个列

SELECT prod_name FROM products;

– 检索多个列

SELECT prod_id, prod_name, prod_price FROM products;

– 检索所有的列

SELECT * FROM products;

– 检索不同的值

select distinct vend_id from products;

– 限制结果 (MYSQL)

SELECT prod_name FROM products;

select prod_name from products limit 5;

select prod_name from products limit 3 offset 0; – 从第0行开始,检索3行

select prod_name from products limit 0, 3; – 从第0行开始,检索3行

问题分析:

1,数据库需要知道等于什么,查数据字典(进行数据库设计的时候,对数据库元素进行的解释说明),这在分析阶段就会增大开销(实际上,ORACLE在解析的过程中, 会将’’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间)。

2,select *最大的问题是可能会多出一些不用的列,这就杜绝了索引覆盖的可能性,导致查询的成本几何级增高(索引覆盖:就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。)

3,网络开销,不需要的字段会增加数据传输的时间,在本地客户端连的是本地mysql服务器,TCP协议传输数据会增加额外的时间;数据量越大这种这种劣势就会越明显;如果db和客户端不在同一台机器,比如链接到阿里云,那这种开销就更加明显

4,从另外一个相似的角度来看;就是查询进行的时候,多取了不必要的列,数据字段比较多,mysql并不是把所有结果全部得到后再进行一次性保存,而是每次分配一块大小的内存空间保存结果集,使用完后,接着再分配一个这样的块,如果还不不够,接着再分配一个块,依此类推,也就是说,有可能在一次查询中mysqI要进行多次内存分配的操作,频繁操作内存都是要耗费时间的。

5,mysql拿到一条命令,会去解析命令、优化查询,然后去存储引擎执行查找,Select*数据库会解析更多的 对象,字段,权限,属性相关,在 SQL 语句复杂,会对数据库造成沉重的负担。选择了实际不会用到的额外的列,就会导致优化和效率问题。

6,原则上讲作为有着良好编程习惯的程序员,也不应该获取自己不需要的东西,若是执行select*,以后表结构修改了,如原表加减了某些列,对代码影响也很大。(源程序就会报错,因为列数不对应。)

7,当然,若是你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*’ 倒是是一个方便的方法,毫无疑问!对于一次性的查询来说,使用Select *没有任何问题,不过要避免将它作为应用开发代码的一部分。程序员可能在代码中编写SQL来选择数据,并放入宿主变量字段。使用Select *时,必须为表中的每一列分别写一个宿主变量。倘若表少了一列,或者表中增加了一个新列呢?如果发生这种情况,就需要调整源代码。为了避免这种可能性,首先就不要使用Select *。

索引拓展:

1,唯一索引怎么判断列唯一:先建立唯一索引, MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。(唯一索引的异常,时由数据库判断,一次 insert 即可,然后程序捕获异常处理)

最好是判断一下,插入之前先看看有没有相同的记录;当然,不做判断直接插入也是可以的,如果没异常,插入成功;如果捕捉到异常,根据异常的类型,判断有重复记录,做出对应业务处理。(去 SqlServer 官方要编号列表呀。然后你的服务器维护这样一个列表,就可以判断哪种因素的原因了)

2,缓存机制的查看

show variables like “%cache”;

show status like “%qcache%”;

参考链接:

http://www.cnblogs.com/xinye/p/3823461.html

https://www.zhihu.com/question/37777220

http://bbs.csdn.net/topics/390302591?page=1#post-393091122

http://blog.csdn.net/wujizkm/article/details/50497642

http://blog.csdn.net/beauty_1991/article/details/51160072

http://blog.csdn.net/li563868273/article/details/51254907

今天的分享就到这里啦,刚学没多久,水平不够,欢迎大家指正,拍砖~

<think>好的,我现在需要帮助用户解决如何查看数据库中已创建的索引的问题。用户可能在使用MySQL或者其他数据库系统,但问题中没有明确说明。首先,我应该考虑不同数据库系统的不同方法,然后给出相应的查询语句。 首先,对于MySQL,查看索引的常用方法是使用SHOW INDEX语句。用户需要知道名,比如SHOW INDEX FROM table_name;。这可能是一个直接的方法,但需要用户知道具体的名。另外,也可以查询information_schema数据库中的STATISTICS,这样可以获取更详细的信息,比如索引名称、列名、是否唯一等。例如:SELECT * FROM information_schema.STATISTICS WHERE table_name = 'your_table';。这个方法适用于需要跨多个查询索引的情况,或者当用户不确定名时,可以调整查询条件。 接下来是PostgreSQL,用户可以使用\di命令在psql命令行工具中查看所有索引。如果使用SQL查询,可以访问pg_indexes视图,例如SELECT * FROM pg_indexes WHERE tablename = 'your_table';。这里需要提醒用户替换your_table为实际名。 然后是Oracle数据库,用户可以通过查询DBA_INDEXES、ALL_INDEXES或USER_INDEXES视图来获取索引信息。例如,SELECT index_name, table_name FROM USER_INDEXES;。需要根据用户的权限选择不同的视图,DBA_INDEXES需要较高的权限。 对于SQL Server,可以使用sp_helpindex存储过程,比如EXEC sp_helpindex 'your_table';。此外,也可以通过查询sys.indexes和sys.tables系统视图来获取信息,例如SELECT name FROM sys.indexes WHERE object_id = OBJECT_ID('your_table');。 用户可能需要知道不同数据库系统的通用方法,或者他们可能在使用特定的系统。考虑到用户没有指定数据库类型,我应该覆盖主要的几种数据库,并提供对应的查询方式。此外,用户可能还想了解索引的更多信息,比如索引类型、是否唯一、涉及的列等,因此应该建议使用更详细的查询语句,如MySQL中的information_schema查询。 还需要注意用户提到的引用内容,其中提到了复合索引和索引的弊端,但用户当前的问题是关于查看现有索引,所以可能不需要深入讨论这些引用内容,但如果有相关的地方可以提及。例如,在查看索引时,可以注意复合索引的字段顺序是否符合最左原则,这可能影响查询性能,但用户当前的问题主要是查看而非优化,所以可能暂时不需要展开。 另外,用户可能对SQL语句的写法不太熟悉,应该给出具体的示例,并提醒替换名等参数。同时,可能需要解释一些术语,比如information_schema是MySQL的系统数据库,存储了元数据信息。 总结一下,回答的结构应该是先按数据库系统分点说明,每个系统给出对应的查看方法,并举例说明。然后,相关问题可以涉及索引的优化、创建索引的方法,或者不同数据库系统的差异等。这样用户可以根据自己的情况选择适合的方法,并进一步探索相关问题。</think>要查看数据库中已创建的索引,不同数据库系统的操作方法略有差异。以下是几种常见数据库的查询方式: --- ### **1. MySQL** - **查看指定的索引**: ```sql SHOW INDEX FROM your_table; ``` 例如:`SHOW INDEX FROM t_user;` 会显示`t_user`的所有索引,包括复合索引的名称、字段和类型[^1]。 - **通过系统查询**: ```sql SELECT * FROM information_schema.STATISTICS WHERE table_name = 'your_table'; ``` 可获取索引名称、字段、唯一性等详细信息。 --- ### **2. PostgreSQL** - **命令行工具**: 在`psql`中执行 `\di` 可列出所有索引,或 `\d your_table` 查看结构(包含索引)。 - **通过系统视图查询**: ```sql SELECT * FROM pg_indexes WHERE tablename = 'your_table'; ``` --- ### **3. Oracle** - **查询用户索引视图**: ```sql SELECT index_name, table_name, uniqueness FROM USER_INDEXES; ``` 若需字段详情,可关联`USER_IND_COLUMNS`视图。 --- ### **4. SQL Server** - **使用存储过程**: ```sql EXEC sp_helpindex 'your_table'; ``` - **查询系统**: ```sql SELECT name AS index_name, type_desc FROM sys.indexes WHERE object_id = OBJECT_ID('your_table'); ``` --- ### **关键注意事项** - 复合索引会显示多个字段,需关注字段顺序是否符合查询的最左原则。 - 索引信息通常包含名称、类型(唯一/非唯一)、关联字段等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值