MYSQL SQL 使用binary导致索引失效的问题分析与总结

2024-7-24 杜世伟 Mysql

在 MySQL 中,是否使用索引取决于查询的具体情况。以下是几个关键点,决定查询是否使用索引:

1. 查询条件:如果查询条件中的列有索引,并且查询能够利用这些索引,那么 MySQL 会尝试使用索引。例如,`WHERE` 子句中的条件列有索引。
2. 查询类型:对于一些特定类型的查询,如 `SELECT`、`UPDATE` 或 `DELETE`,MySQL 会尝试使用索引来优化查询性能。
3. 索引类型:
   - B-Tree 索引:默认情况下,MySQL 使用 B-Tree 索引。对于等值查询、范围查询等都能有效利用。
   - 全文索引:用于全文搜索。
   - 哈希索引:仅适用于 Memory 引擎,用于等值查询。
4. 数据类型:索引的使用也取决于列的数据类型和索引类型是否匹配。例如,`BINARY` 数据类型的列如果有 B-Tree 索引,在等值查询时可以有效使用。
5. 查询优化器:MySQL 查询优化器决定是否使用索引。它会根据查询的成本估算(例如全表扫描 vs. 使用索引扫描)来决定是否使用索引。你可以使用 `EXPLAIN` 语句查看查询的执行计划,确定 MySQL 是否使用了索引。



`BINARY` 数据类型表示固定长度的二进制字符串。如果对 `BINARY` 列建立了索引,并且查询条件能够利用这个索引(如等值查询),MySQL 将会使用这个索引来优化查询。例如:

```mysql
CREATE TABLE example (
    id INT PRIMARY KEY,
    data BINARY(16),
    INDEX (data)
);

SELECT * FROM example WHERE data = BINARY 'your_binary_data';
```

在上述查询中,如果 `data` 列有索引,并且查询条件使用了等值比较,MySQL 将会使用索引来查找匹配的行。


MySQL 是否走索引取决于多个因素,包括查询条件、索引类型和查询优化器的决策。你可以使用 `EXPLAIN` 语句来查看具体的查询执行计划,以确定是否使用了索引。如果有需要进一步优化查询性能,可以考虑调整索引、查询语句或使用其他优化技术。


通过下面的范例可以看到两种不同的写法效果完全不同:

1)binary在前:SELECT * from `表` where binary cdkey = :cdkey for update

2)binary在后:SELECT * from `表` where cdkey = binary :cdkey for update

20240724-165854.png

Powered by emlog 沪ICP备2023034538号-1