Sql Select语句优化

Posted

技术标签:

【中文标题】Sql Select语句优化【英文标题】:Sql Select statement Optimization 【发布时间】:2020-12-08 09:04:17 【问题描述】:

我在sql中做了一个测试表,信息架构如下图所示:

现在我使用python脚本提取这些信息,其代码如下所示:

import pandas as pd
import mysql.connector
 
db = mysql.connector.connect(host="localhost", user="root", passwd="abcdef")
pointer = db.cursor()
pointer.execute("use holdings")
x = "Select * FROM orders where tradingsymbol like 'TATACHEM'"
pointer.execute(x)
rows = pointer.fetchall()
rows = pd.DataFrame(rows)
stock = rows[1]

生产表包含 200 个独特的交易品种,其架构类似于测试表。

我怀疑以下陈述:

x = "Select * FROM orders where tradingsymbol like 'TATACHEM'"

我将不得不更换交易品种的价值 200 次,这是无效的。

有没有有效的方法来做到这一点?

【问题讨论】:

Python MySQL parameterized queries 如果你有一个匹配的字符串,“=”会给你比 LIKE 更好的性能,但上面的链接很好地解释了该怎么做 为什么匹配的字符串比 LIKE 的性能更好 LIKE 接受通配符。这意味着它需要解析您提供的任何内容,因此如果您进行直接比较,则会产生大量开销 @AnnaSemjén - x LIKE '...' 不带通配符 会变成x = '...'。所以,没有性能差异。 【参考方案1】:

如果我对您的理解正确,您的问题是您希望避免为每个交易品种发送多个查询,对吗?在这种情况下,以下MySQL IN 可能会有所帮助。然后您可以简单地向包含您想要的所有交易品种的数据库发送一个查询。如果您想对各种交易品种做不同的事情,您可以选择 pandas 中的子集。

另一个性能改进可能是pandas.read_sql,因为这在一定程度上加快了数据帧的创建速度

为了提高效率还要添加两件事:

确保在 MySQL 中对交易符号进行索引以加快查找过程 将交易符号设为 ENUM 以确保不接受任何拼写错误或类似内容。否则上述“IN”方法也不起作用,因为它会进行全文比较。

【讨论】:

以上是关于Sql Select语句优化的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句优化系列三(关于select查询)

SQL语句及数据库优化

mysql优化--explain

3,SQL语句及数据库优化

SQL语句优化系列一

SQL语句优化-关于分组求平均值