【问题标题】:Indexes on SQL statementSQL 语句的索引
【发布时间】:2020-05-27 12:08:16
【问题描述】:

刚开始学习 SQL,只是想知道索引是如何工作的,例如(主键为粗体):

  • 酒店(hotelNo,hotelName,城市),
  • 房间(roomNo,hotelNo,类型,价格),
  • Booking (hotelNo, guestNo, dateFrom, dateTo, roomNo),
  • 来宾(guestNo、guestName、guestAddress)

查询:

SELECT 
    r.roomNo, r.type, r.price 
FROM 
    Room r, 
    Booking b, Hotel h 
WHERE 
    r.roomNo = b.roomNo 
    AND b.hotelNo = h.hotelNo 
    AND h.hotelName = "Hilton" 
    AND r.price > 200

谁能解释我将如何使用任何索引来提高查询性能?我正在考虑按价格对其进行排序,这样 SQL Server 就不必手动检查每一行,但是否应该建立任何其他索引?另外,主键总是聚集索引吗?

【问题讨论】:

  • 如果你只是学习 SQL,为什么不学习正确的、明确的、标准的 JOIN 语法?
  • ALTER TABLE Room ADD INDEX price_index (price)
  • @SALEH 你能解释一下你的意思吗?另外,我们如何证明我们应该索引某些东西?还是只是常识?
  • 我假设您使用 mysql 作为数据库。上面的 DML 在 mysql 中的表的列上创建一个新索引。确定向表添加索引的必要性取决于多种因素。索引的标准可以是预期某个读取查询会在表上更频繁地执行。在这种情况下,最好为这些查询制定一些索引策略。在这种情况下,索引的理想候选者是在该查询的where 子句中使用其值的列
  • 您可以查看here 以获得更多见解。这是一个相当普遍的话题。 Google 搜索会为您提供更有用的结果

标签: sql database-indexes


【解决方案1】:

我不会直接回答您的问题,但会尝试给出一个总体思路,以便您可以根据应用程序的用例(可能会有所不同)自行改进数据库查询性能:

  • 无需在主键上建立索引
  • 索引那些可能/将需要在您的数据库中频繁搜索/查询的字段。
  • 在为任何列编制索引时,尽量确保列的值是低丰度的(虽然不是那么重要)
  • 尝试在多列上建立索引,如果已经完成,则无需在单个列上建立索引
  • 必须在where子句之后保持查询中的索引顺序,否则结果会对db产生负面影响。
  • 另外,请记住,索引也会消耗您的数据库空间!良好的索引有助于提高性能,而糟糕的索引会降低您的系统。

更多旁注,您可以查看此链接What columns generally make good indexes?

索引愉快!

【讨论】:

    猜你喜欢
    • 2015-01-26
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2014-01-06
    • 2013-09-28
    相关资源
    最近更新 更多