Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在SQL中创建索引以提高性能_Mysql_Sql_Sql Server - Fatal编程技术网

Mysql 如何在SQL中创建索引以提高性能

Mysql 如何在SQL中创建索引以提高性能,mysql,sql,sql-server,Mysql,Sql,Sql Server,我在数据库表中有大约200000行。当我执行搜索查询时,在下一页中给出结果大约需要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 no

我在数据库表中有大约200000行。当我执行搜索查询时,在下一页中给出结果大约需要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%')

为了提高性能,我没有太多的数据库索引知识。请指导我使用什么索引。

索引没有帮助。LIKE是一个非sargable操作符

有一本好书

LIKE不使用全文索引。如果您想使用全文搜索,您可以使用MySQL全文搜索功能,您可以阅读关于此的文档

以下是在MySQL中添加索引的语法:

ALTER TABLE `feed`   
  ADD INDEX (`Name`);
MySQL匹配示例:

子串匹配:(匹配:巴比伦语、巴西音等)

精确匹配:

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

开始匹配字符串时使用的通配符opeartor
%
会使创建的任何索引无效

第一个通配符运算符前面的字符越多,索引查找扫描越快

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

ALTER TABLE feed ADD INDEX (NAME);
即使在名称列上创建索引后,也不会使用索引,因为它具有前导%字符

select * from feed where (name like '%Baby%' And NAME like '%Bassinet%')
这将使用索引作为已删除的起始%s

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

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

您可以使用全文搜索,只定义需要查找数据的列。FTS非常有用,当您拥有更多数据时,它可以更快地获取数据

如何启用FTS,请检查链接



您在查询中使用了两个like,但事实并非如此。我认为您可能能够优化其中一个类似项(这将提高您的性能)。也,您可以尝试运行查询。您可以重新考虑WHERE子句:
WHERE名称,如“%Baby%Baby%”
WHERE名称,如“%Baby%Baby%”
@MihaiBejenariu您给出的查询将是可索引的?-1标记
mysql
sql server
。请澄清您使用的是mysql还是Microsoft sql>服务器,而不是重新询问问题。意思是,如果我在查询中使用like,则无法对该查询进行索引。是吗?like只有在使用前导通配符时才是不可搜索的。第一个%字符之前的字符越多,索引使用效果越好…k.如果我在baby和basinet之前删除%符号,并在这些单词之后保留%符号,查询应该是可索引的。是吗?是。要使其像现在这样工作,您必须查看全文索引(及其相应的查询),普通索引不能与开头一起使用。我应该如何创建一个将与此查询一起添加的索引?我是否需要使用alter TABLE
feed
add index(
NAME
)将alter query或substring query也@jomsk1eAdd index用于列“NAME”。。。并根据需要在查询中使用子字符串匹配或精确匹配。一个是你为子字符串提供的select查询,一个是alter查询。你只需要添加一次索引。这意味着你在文章中提到的最后一个查询是可索引的,正确吗?k.sir.你能不能指导我如何在这个表上创建索引以快速读取数据…请参阅上面的alter table语句这只是我需要做的索引,先生。或者我还需要设计一些其他查询!!!!但是如果我删除单词前的%符号,比如如果我将其保留为baby%,那么索引应该有效。ryt?否,%表示通配符,因此我们得到的结果是从baby开始,但以“baby”或“baby123”结束。所以索引只需搜索索引叶上的当前数据。正如我所写的,微软引入了FTS,它比同类运营商更快。
select * from feed where (name like 'Baby%' And NAME like 'Bassinet%')