我想知道下列之间在性能方面是否有任何差异
SELECT ... FROM ... WHERE someFIELD IN(1,2,3,4)
SELECT ... FROM ... WHERE someFIELD between 0 AND 5
SELECT ... FROM ... WHERE someFIELD = 1 OR someFIELD = 2 OR someFIELD = 3 ...
Run Code Online (Sandbox Code Playgroud)
或者MySQL会像编译器优化代码一样优化SQL吗?
编辑:由于评论中陈述的原因,将's 更改为AND's OR.
哪个更快?
SELECT UserName
FROM dbo.UserTable
WHERE UserID in (1,3,4)
Run Code Online (Sandbox Code Playgroud)
SELECT UserName
FROM dbo.UserTable
WHERE UserID = 1
OR UserID = 3
OR UserID = 4
Run Code Online (Sandbox Code Playgroud) 具有'in'表达式的JPA条件API转换为多个'OR'而不是'in'
例如
我的主要模特
public class Person {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "department_id")
private Department department;
...
}
Run Code Online (Sandbox Code Playgroud)
多对一的关系
public class Department {
@Id
@Column(name="department_id")
private Integer departmentId;
@OneToMany(mappedBy="department")
private List<Person> person;
...
}
Run Code Online (Sandbox Code Playgroud)
在persistence.xml中定义了这两个模型(注意:它没有指定任何db方言)
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="primary" transaction-type="JTA">
<jta-data-source>java:openejb/Resource/jdbc/myDS</jta-data-source>
<class>com.xyz.Person</class>
<class>com.xyz.Department</class>
...
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="openjpa.Log" value="${open.jpa.log}" />
<property name="openjpa.ConnectionFactoryProperties" value="printParameters=true" />
<property name="openjpa.RuntimeUnenhancedClasses" value="unsupported" />
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
以下是使用Criteria API构建查询的代码:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Person> criteriaQuery = cb.createQuery(Person.class);
Root<Person> personRoot = criteriaQuery.from(Person.class); …Run Code Online (Sandbox Code Playgroud) 我想知道哪些更快(性能方面)查询(在MySQL 5.x CentOS 5.x上,如果这很重要):
SELECT * FROM table_name WHERE id=1;
SELECT * FROM table_name WHERE id=2;
.
.
.
SELECT * FROM table_name WHERE id=50;
Run Code Online (Sandbox Code Playgroud)
要么...
SELECT * FROM table_name WHERE id IN (1,2,...,50);
Run Code Online (Sandbox Code Playgroud)
我有大约50 id秒来查询.我知道通常数据库连接很昂贵,但我已经看到这个IN条款不是那么快[有时].
我手边没有"解释计划".你能帮忙说出以下哪项更有效率吗?
选项1:
select ...
from VIEW_ABC
where STRING_COL = 'AA'
OR STRING_COL = 'BB'
OR STRING_COL = 'BB'
OR ...
OR STRING_COL = 'ZZ'
Run Code Online (Sandbox Code Playgroud)
选项2:
select ...
from VIEW_ABC
where STRING_COL IN ('AA','BB',...,'ZZ')
Run Code Online (Sandbox Code Playgroud) MySQL服务器版本:5.1.41在Ubuntu 10.04上
我在修改一些查询时想到了MySQL的行为,并且想知道它的原因.
基本上我正在创建一个视图.当我查询视图时,结果集是相同的但是,对于IN子句而言,读取的行数与子句不同OR.下面是一个简单的例子:
CREATE TABLE country (
id_country int(11) NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
PRIMARY KEY (id_country)
) ENGINE=InnoDB;
INSERT INTO country (name) VALUES ('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ('G'), ('H');
CREATE TABLE status (
id_status int(11) NOT NULL AUTO_INCREMENT,
id_country int(11) NOT NULL,
status tinyint(4) NOT NULL,
PRIMARY KEY (id_status)
) ENGINE=InnoDB;
ALTER TABLE status ADD INDEX ( id_country );
ALTER TABLE status ADD FOREIGN KEY ( id_country ) REFERENCES test.country …Run Code Online (Sandbox Code Playgroud) 我有一个 Java 程序,它需要遍历 aHashMap来获取一个参数,然后用于查询 MySQL 数据库。
代码如下:
Iterator<Entry<String, Double>>it = ws.entrySet().iterator();
Connection con = null;
while(it.hasNext())
{
Entry<String, Double>pairs = it.next();
PreparedStatement ps = con.prepareStatement("select doc_freq from lookup where word=?");
ps.setString(1, pairs.getKey());
ResultSet rs = ps.executeQuery();
}
Run Code Online (Sandbox Code Playgroud)
为循环的每次迭代(大约 500 次)重复访问数据库的过程减慢了我的应用程序。有什么办法可以一次发送所有这些参数,以便我只访问数据库一次?
假设我有一个很长的查询字符串,例如.
SELECT id from users where collegeid='1' or collegeid='2' . . . collegeid='1000'
Run Code Online (Sandbox Code Playgroud)
它会以任何方式影响速度或输出吗?
SELECT m.id,m.message,m.postby,m.tstamp,m.type,m.category,u.name,u.img
from messages m
join users u on m.postby=u.uid
where m.cid = '1' or m.cid = '1' . . . . . .
or m.cid = '1000'. . . .
Run Code Online (Sandbox Code Playgroud) 假设我有以下表结构:
create table PEOPLE (
ID integer not null primary key,
NAME varchar(100) not null
);
create table CHILDREN (
ID integer not null primary key,
PARENT_ID_1 integer not null references PERSON (id),
PARENT_ID_2 integer not null references PERSON (id)
);
Run Code Online (Sandbox Code Playgroud)
我想生成每个父母的姓名列表。在光滑的我可以写这样的东西:
for {
parent <- people
child <- children if {
parent.id === child.parent_id_1 ||
parent.id === child.parent_id_2
}
} yield {
parent.name
}
Run Code Online (Sandbox Code Playgroud)
这会生成预期的 SQL:
select p.name
from people p, children c
where p.id = c.parent_id_1 or p.id …Run Code Online (Sandbox Code Playgroud) 我在这里看到很多关于在IN子句中使用元组的问题.我的情况与其他情况略有不同.IN子句中元组的一般用法如下所示
Select * from MY_TABLE
where (id,name,date) IN ((1,'new','10-JUL-13'),(2, 'old','09-JUN-13'))
Run Code Online (Sandbox Code Playgroud)
考虑到上述查询,我的要求是检索具有id和name值的记录以及特定范围内的日期.我们说吧
effectiveDate <= date <= termDate
Run Code Online (Sandbox Code Playgroud)
我正在使用ORACLE数据库和MyBatis ORM.我将数据作为对象列表获取,因此当我使用mybatis时,我可以使用foreach/for循环来填充元组,但是当我想使用条件来处理对象中的一个值时.
当我使用Mybatis从列表中读取一个值时,where子句如下所示
<where>
and (id,name) IN
<foreach item="object" collection="data" open="(" separator=","close=")">
(#{object.id},#{object.name})
</foreach>
</where>
Run Code Online (Sandbox Code Playgroud)
我也必须在循环中包含条件.
等待专家的建议.提前致谢.
我不确定IN子句的功能,因此我想知道是否可以安全地运行查询。据我了解,在SQL Server中使用IN子句时会创建一系列OR语句:例如
SELECT * FROM table WHERE column IN (1, 2, 3, 4, 5, 6)
Run Code Online (Sandbox Code Playgroud)
将与以下相同:
SELECT * FROM table WHERE column = 1 OR column = 2 OR column = 3 OR column = 4 OR column = 5 OR column = 6
Run Code Online (Sandbox Code Playgroud)
但是,当执行这样的操作时会发生什么:
SELECT * FROM table WHERE column IN (1, 2, 3) and column2 IN (4,5,6) and column 3 IN (5,7,8)
Run Code Online (Sandbox Code Playgroud)
在这里我想知道,例如,如果第一个IN中的某个值在第二个IN中有两次出现,它将检索两个结果,还是按1、4和5的顺序执行(IN子句中的第一个值)
我想用8个参数运行查询,需要在数据库中检查(通过C#发送),但我不想用很多OR这样构建一个超大型查询(因为它将是+ 90k记录)
SELECT * FROM table WHERE (column = 1 and column2 = 4 and …Run Code Online (Sandbox Code Playgroud)