为什么要避免使用 select * ?
为什么要避免使用 select * ?
- 很少有需要同时获取所有字段数据的情况,此时使用 selec * 会将不需要的字段一并查出,浪费系统资源,降低查询效率。
- 可读性低(无法直观的知道查询是为了获取哪些数据)
- 更难使用到索引
验证
有tbl_student_card表:
在card_id、student_id字段上创建复合索引:
CREATE INDEX idx_cardid_studentid ON tbl_student_card(card_id,student_id)
查询1:没有使用到索引
查询2:使用到idx_cardid_studentid索引
查询3:使用到idx_cardid_studentid索引
查询4:使用到idx_cardid_studentid索引
总结:假设当前查询的目的只是为了获取card_id和student_id字段的信息。直接写select * 确实省事,但是很难用到索引(下文说面如何select * 在什么情况下会使用到索引),查询的效率往往很低。
如何使 select * 使用到索引?
创建覆盖所有字段的索引:
CREATE INDEX idx_all ON tbl_student_card(card_id,student_id,card_no,issue_date,end_date,note)
验证:由于创建了覆盖所有字段的索引,select * 使用到了索引
总结:
- 创建覆盖所有字段的索引,索引文件会很大,查询性能下降
- 当查询的字段全部可以从某个索引的索引树获取,该查询就不会再从数据库表获取数据。
- 如果数据库表新增字段,select * 将再次无法使用到索引(因为刚才新建的idx_all索引并不包含该新增字段)
Kamen Black君: 确实如此
一切随缘~~~: parall
杨某不才: 是有问题
qqqqqqqywu: 结果矩阵的行数*结果矩阵的列数==矩阵1的行数*矩阵2的行数这句有问题吧,应该是(矩阵1的行数+矩阵2的行数)*(矩阵1的行数*矩阵2的行数)吧
zcrazy胡说八道: 有用有用