sql,in数据优化

由于数据量较大in查询效率较低,速度慢,网上查询到一种可以优化in的方案,特此记下,以备下次复用。

在数据库中新建三张表

sql,in数据优化_第1张图片

sql,in数据优化_第2张图片

sql,in数据优化_第3张图片

新建测试数据代码:

package info.lumanman.sql;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;




public class SqlTest {


private static  String driver="com.mysql.jdbc.Driver";

private static String url="jdbc:mysql://127.0.0.1:3306/sql";

private static String username="root";

private static String password="123456";
public static void main(String[] args) throws SQLException, ClassNotFoundException {

addProfession();

}

public void addStudent() throws ClassNotFoundException, SQLException{
Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection(url, username, password);
Statement st=null;
for(int i=0;i<20000;i++){
String sql="insert into t_student (f_id,f_name,f_class_id) values("+i+",'张三',2)";
st= con.createStatement();
st.execute(sql);
}
st.close();
con.close();
}

public static void addClass() throws ClassNotFoundException, SQLException{
Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection(url, username, password);

Statement st=null;
for(int i=0;i<20000;i++){
String sql="insert into t_class (f_id,f_name) values("+i+","+i+")";
st= con.createStatement();
st.execute(sql);
}
st.close();
con.close();

}

public static void addProfession() throws ClassNotFoundException, SQLException{
Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection(url, username, password);
Statement st=null;
for(int i=0;i<20000;i++){
String sql="insert into t_profession (f_id,f_name,f_class_id) values("+i+","+i+","+i+")";
    st= con.createStatement();
st.execute(sql);
}
st.close();
con.close();
}
}

测试sql:

一:in的写法:SELECT
f_name
FROM
t_student
WHERE
f_class_id IN (
SELECT
f_id
FROM
t_class
WHERE
f_name = '1'
UNION ALL
SELECT
f_class_id
FROM
t_profession
WHERE
f_name = '1'

);

二:新的写法:

SELECT
s.f_name,
s.f_class_id
FROM
t_student s,
(
SELECT
f_id
FROM
t_class
WHERE
f_name = '1'
UNION
SELECT
f_class_id f_id
FROM
t_profession
WHERE
f_name = '1'
) c
WHERE

c.f_id = s.f_class_id;

这种方法仅适用于in子查询中比较复杂的sql,优化效果刚刚的。

参考地址https://www.jb51.net/article/117412.htm




你可能感兴趣的:(sql,in数据优化)