Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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子查询优化_Mysql - Fatal编程技术网

Mysql子查询优化

Mysql子查询优化,mysql,Mysql,我有一个包含450000条记录的用户表。表格结构如下所示: UserID Int(11) Primary Key Firstname (50) Varchar Lastname (50) Varchar 我还需要检查另外两个表,看看UserID是否在这些表中。结构有点不同,但表具有相同的UserID 我正在运行下面的子查询,运行速度非常慢。欣赏第二双眼睛,提供一个全新的视角,帮助你跑得更快 SELECT `Users`.`Firstname`, `Users`.`Lastna

我有一个包含450000条记录的用户表。表格结构如下所示:

  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%”上放置索引。