【问题标题】:How to create index in SQL to increase performance如何在 SQL 中创建索引以提高性能
【发布时间】:2014-06-10 15:38:25
【问题描述】:

我在数据库表中有大约 200,000 行。当我执行搜索查询时,大约需要 4-5 秒才能在下一页给我结果。我希望执行速度应该很快,结果应该在 2 秒内加载。我的表中有大约 16 列。

以下是我创建表的查询

Create table xml(
PID int not null,
Percentdisc int not null,
name varchar(100) not null,
brand varchar(30) not null,
store varchar(30) not null,
price int not null,
category varchar(20) not null,
url1 varchar(300) not null,
emavail varchar(100) not null,
dtime varchar(100) not null,
stock varchar(30) not null,
description varchar(200) not null,
avail varchar(20) not null,
tags varchar(30) not null,
dprice int not null,
url2 varchar(300),
url3 varchar(300),
sid int primary key auto_increment);

选择我正在使用的查询

select * from feed where (name like '%Baby%' And NAME like '%Bassinet%')

我对为数据库建立索引以提高性能知之甚少。请指导我使用什么索引。

【问题讨论】:

  • 您在查询中使用了两个赞,AFAIK 不是indexable。我认为您可能能够优化其中一个(这应该会提高您的性能)。此外,您可以尝试在查询中运行 explain。
  • 您可以重新考虑您的 WHERE 子句:where name like '%Baby%Bassinet%' 或 where name like '%Bassinet%Baby%'
  • @MihaiBejenariu-您给出的查询将是可索引的吗?
  • -1 标记mysql 和sql-server。
  • 请说明您使用的是 MySQL 还是 Microsoft SQL Server,而不是重新提问。

标签: mysql sql sql-server


【解决方案1】:

索引无济于事。 LIKE 是一个非 sargable 运算符。 http://en.wikipedia.org/wiki/Sargable

【讨论】:

  • 意味着,如果我在我的查询中使用 like ,则无法对该查询进行索引。是吗?
  • LIKE 仅当它带有前导通配符时是不可搜索的......更多是第一个 % 字符之前的字符更好的是索引使用......
  • k.如果我在 baby 和 bassinet 之前删除 % 符号并在这些词之后保留 % 符号,查询应该是可索引的。是吗?
  • 是的。要让它像现在这样工作,您必须查看全文索引(及其相应的查询),普通索引不能与开头的 % 一起使用。
【解决方案2】:

匹配字符串开头使用的通配符运算符% 会使创建的任何索引都变得无用。

第一个通配符之前的字符越多,索引查找扫描越快。

无论如何,您都可以向现有表添加索引

ALTER TABLE feed ADD INDEX (NAME);

即使在 NAME 列上创建索引后,也不会使用索引,因为它有一个前导 % 字符

select * from feed where (name like '%Baby%' And NAME like '%Bassinet%')

这将使用索引作为删除的起始百分比

select * from feed where (name like 'Baby%' And NAME like 'Bassinet%')

【讨论】:

  • 这意味着你在你的帖子中提到的最后一个查询,将是可索引的,对吗?
  • k.sir.can u 请指导我如何在此表上创建索引以快速读取数据....
  • 见上面的 alter table 语句
  • 这只是我需要为索引先生做的事情。或者我还需要设计其他一些查询!!!!
【解决方案3】:

here 读得很好。

LIKE 不使用全文索引。如果你想使用全文搜索,你可以使用 MySQL 全文搜索功能,你可以阅读MySQL doc 关于这个。

这是在 MySQL 中添加 INDEX 的语法:

ALTER TABLE `feed`   
  ADD INDEX (`Name`);

MySQL 匹配示例:

子字符串匹配:(匹配:Babylonian、Bassieete 等)

SELECT * FROM `feed` WHERE MATCH (NAME) AGAINST ("+Baby* +Bassinett*" IN BOOLEAN MODE);

完全匹配:

SELECT * FROM `feed` WHERE MATCH (NAME) AGAINST ("+Baby +Bassinett" IN BOOLEAN MODE);

【讨论】:

  • 我应该如何创建一个索引来添加这个查询
  • k.我是否也只需要使用更改查询或子字符串查询@jomsk1e
  • 使用 ALTER TABLE feed 添加索引到列 'NAME' 添加索引(Name)...并根据您的需要在查询中使用子字符串匹配或完全匹配..
  • k.means 我有 2 个查询 ryt。一个将是您为子字符串提供的选择查询和一个更改查询。
  • 只需要添加一次索引。
【解决方案4】:

在您的情况下,索引没有用。当我们使用 like 运算符找到它时,它不使用索引。当我们直接搜索时,即 columnname = 'Ajay',此时它在索引中搜索(如果适用)。原因是索引是搜索物理数据,而不是逻辑数据(对于类似运算符)。

您可以为此使用全文搜索,您可以只定义需要在其中查找数据的那些列。 FTS 很有用,当您拥有更多数据时,您可以获得更快的数据。

如何启用FTS,请查看链接。

http://blog.sqlauthority.com/2008/09/05/sql-server-creating-full-text-catalog-and-index/

【讨论】:

  • 但是如果我在单词之前删除 % 符号,比如我将其保留为 baby%,那么索引应该可以工作。ryt?
  • 不,% 表示通配符,所以我们得到的结果是从 baby 开始,但以 "baby" 或 "baby ballon" 或 "baby123" 结尾。所以索引简单地搜索索引叶子上的当前数据。正如我所写的,对于 % microsoft,它引入了比 like 运算符更快的 FTS。
猜你喜欢
  • 2020-06-22
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 2011-09-17
  • 2015-11-17
  • 1970-01-01
相关资源
最近更新 更多