在mysql中,使用<>和not in ,或是not那种情况不走索引
时间: 2024-02-26 19:51:38 浏览: 115
在 MySQL 中,使用 != 或 <> 操作符或 NOT IN 子句时,可能不会使用索引,因为这些操作符无法利用索引中的排序顺序。如果使用这些操作符进行数据筛选,MySQL 通常会执行全表扫描以找到匹配的记录,这可能会导致性能瓶颈。
如果您需要使用这些操作符进行数据筛选,并希望利用索引,可以考虑使用其他技术,如使用 JOIN 或 EXISTS 子句。另外,如果您的表结构允许,可以尝试使用更适合这些操作符的数据类型,例如枚举类型。
总之,当使用 != 或 <> 操作符或 NOT IN 子句时,需要仔细考虑查询性能,并根据实际情况选择最佳的优化方案。
相关问题
MySQL优化:select brandName,have_vin_count,(select count(1) from epc_carmodel_skucount where ifnull(vin,'') <> '') as have_vin_sum_count, concat(round(have_vin_count/(select count(1) from epc_carmodel_skucount where ifnull(vin,'') <> '')*100, 2),'%') as have_vin_percent from (select b.brandName,count(distinct a.vehicleUUID) as have_vin_count from (select distinct vehicleUUID from epc_carmodel_skucount where ifnull(vin,'') <> '') a inner join ( select b.brandName,b.vehicleUUID from epc_material_sence_model a join ( select * from epc_bom_sence where brandName not in ('演示','测试','客服内测') and ifnull(brandName,'') <> '' and brandName not like '火星%' and brandName not like '原厂%' ) b on a.oeId=b.oeId where a.categoryName='火花塞' ) b on a.vehicleUUID=b.vehicleUUID group by b.brandName
这段 SQL 语句是查询汽车品牌的火花塞车型中,有 VIN 码的车型数量及占比。其中使用了子查询和连接查询,可能会有性能问题。建议优化如下:
1. 尽量避免在子查询中使用聚合函数,可以将子查询的结果存储到临时表中,以提高查询效率。
2. 将子查询中的 ifnull(vin,'') <> '' 转换为 vin IS NOT NULL AND vin <> '',可以利用索引优化查询。
3. 使用 JOIN 操作时,尽量通过 ON 子句指定连接条件,避免使用 WHERE 子句进行过滤,提高查询效率。
优化后的 SQL 语句如下:
```
SELECT
b.brandName,
COUNT(DISTINCT a.vehicleUUID) AS have_vin_count,
COUNT(DISTINCT c.vehicleUUID) AS have_vin_sum_count,
CONCAT(ROUND(COUNT(DISTINCT a.vehicleUUID) / COUNT(DISTINCT c.vehicleUUID) * 100, 2), '%') AS have_vin_percent
FROM
epc_carmodel_skucount a
INNER JOIN (
SELECT
b.brandName,
b.vehicleUUID
FROM
epc_material_sence_model a
JOIN (
SELECT *
FROM epc_bom_sence
WHERE brandName NOT IN ('演示', '测试', '客服内测')
AND IFNULL(brandName, '') <> ''
AND brandName NOT LIKE '火星%'
AND brandName NOT LIKE '原厂%'
) b
ON a.oeId = b.oeId
WHERE a.categoryName = '火花塞'
) b
ON a.vehicleUUID = b.vehicleUUID
AND a.vin IS NOT NULL
AND a.vin <> ''
LEFT JOIN epc_carmodel_skucount c
ON c.vin IS NOT NULL
AND c.vin <> ''
GROUP BY
b.brandName
```
这样,可以避免子查询中的聚合函数,使用 INNER JOIN 操作指定连接条件,同时使用 LEFT JOIN 操作获取所有有 VIN 码的车型数量,从而提高查询效率。
mysql notin优化
当使用 `NOT IN` 来查询MySQL数据库时,可能会遇到性能问题,因为它需要执行全表扫描,这会导致查询时间延长。
以下是一些优化 `NOT IN` 查询的方法:
1. 使用 `NOT EXISTS` 替代 `NOT IN`。
2. 如果 `NOT IN` 中的值是一个子查询,则可以使用 `LEFT JOIN` 来代替。
3. 尽量避免使用 `NOT IN`,可以使用其他查询方式来代替。
4. 如果必须使用 `NOT IN`,可以考虑将其分解成多个 `NOT OR` 查询。
5. 对于常用的查询,可以使用索引来优化查询性能。
6. 将 `NOT IN` 中的值放入一个临时表中,然后使用 `JOIN` 来代替查询。
请注意,优化查询的方法取决于查询的具体情况,可能需要根据实际情况进行调整。
阅读全文