Mysql子查询优化
我有一个包含450000条记录的用户表。表格结构如下所示:Mysql子查询优化,mysql,Mysql,我有一个包含450000条记录的用户表。表格结构如下所示: UserID Int(11) Primary Key Firstname (50) Varchar Lastname (50) Varchar 我还需要检查另外两个表,看看UserID是否在这些表中。结构有点不同,但表具有相同的UserID 我正在运行下面的子查询,运行速度非常慢。欣赏第二双眼睛,提供一个全新的视角,帮助你跑得更快 SELECT `Users`.`Firstname`, `Users`.`Lastna
UserID Int(11) Primary Key
Firstname (50) Varchar
Lastname (50) Varchar
我还需要检查另外两个表,看看UserID是否在这些表中。结构有点不同,但表具有相同的UserID
我正在运行下面的子查询,运行速度非常慢。欣赏第二双眼睛,提供一个全新的视角,帮助你跑得更快
SELECT
`Users`.`Firstname`,
`Users`.`Lastname`,
`Users`.`UserID`
FROM `Users`
WHERE `Users`.`UserID` IN (SELECT `admin`.`UserID` FROM `admin` WHERE `admin`.`UserID`=`User`.`UserID`)
AND `Users`.`UserID` IN (SELECT `elite`.`UserID` FROM `elite` WHERE `elite`.`UserID`=`Users`.`UserID`)
AND `Users`.`Lastname` LIKE '%smith%'
在MySQL中优化查询时,最重要的一点是确保有适当的索引。使用SHOW INDEX检查您有哪些索引,使用EXPLAIN SELECT检查查询正在使用哪些索引。一旦表变大,索引对于良好的性能是绝对重要的
特别是,您应该确保在所有三个表中的UserID列上都有索引。如果您的情况合适,我还建议添加外键约束
但是,如果已检查索引是否正确,但仍无法获得适当的性能,则可以尝试使用联接而不是子选择:
SELECT
Users.Firstname,
Users.Lastname,
Users.UserID
FROM Users
JOIN admin USING (UserID)
JOIN elite USING (UserID)
WHERE Users.Lastname LIKE '%smith%'
请注意,像“%smith%”一样,无法有效地使用索引。如果可能的话,您应该避免使用以通配符开头的LIKE表达式。在MySQL中优化查询时,最重要的一点是确保您拥有适当的索引。使用SHOW INDEX检查您有哪些索引,使用EXPLAIN SELECT检查查询正在使用哪些索引。一旦表变大,索引对于良好的性能是绝对重要的
特别是,您应该确保在所有三个表中的UserID列上都有索引。如果您的情况合适,我还建议添加外键约束
但是,如果已检查索引是否正确,但仍无法获得适当的性能,则可以尝试使用联接而不是子选择:
SELECT
Users.Firstname,
Users.Lastname,
Users.UserID
FROM Users
JOIN admin USING (UserID)
JOIN elite USING (UserID)
WHERE Users.Lastname LIKE '%smith%'
请注意,像“%smith%”一样,无法有效地使用索引。如果可能,您应该避免使用以通配符开头的LIKE表达式。以连接开头
SELECT
`Users`.`Firstname`,
`Users`.`Lastname`,
`Users`.`UserID`
FROM `Users`
INNER JOIN `admin` ON (`Users`.`UserID` = `admin`.`Users`)
INNER JOIN `elite` ON (`Users`.`UserID` = `elite`.`UserID`)
WHERE `Users`.`Lastname` LIKE '%smith%'
然后检查你的索引
您还应该注意,您的姓氏搜索速度会很慢,因为它没有锚定在姓氏字符串的开头或结尾。从连接开始
SELECT
`Users`.`Firstname`,
`Users`.`Lastname`,
`Users`.`UserID`
FROM `Users`
INNER JOIN `admin` ON (`Users`.`UserID` = `admin`.`Users`)
INNER JOIN `elite` ON (`Users`.`UserID` = `elite`.`UserID`)
WHERE `Users`.`Lastname` LIKE '%smith%'
然后检查你的索引
您还应该注意,您的姓氏搜索速度会很慢,因为它没有定位在姓氏字符串的开头或结尾。我想您应该使用内部联接,而不是子查询……因为现在您正在从管理表中获取用户id,elite表和检查必须在user表中…所以继续使用join并查看差异。我想您应该使用内部联接,而不是子查询…因为现在您正在从admin表获取用户id,elite表和检查表必须在用户表中…所以继续join并查看差异。表上有哪些索引?后显示创建表。。。对于每个表,以及post EXPLAIN SELECT。。。输出。表上有哪些索引?后显示创建表。。。对于每个表,以及post EXPLAIN SELECT。。。输出。值得一提的是,您不能在“%smith%”上放置索引。值得一提的是,您不能在“%smith%”上放置索引。