MYSQL SQL 使用binary导致索引失效的问题分析与总结
在 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 是否使用了索引。
```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
热门日志
分类
- Django(4)
- ssdb(1)
- Mac(7)
- C(1)
- memcache(1)
- Python(32)
- Vim(8)
- sed(2)
- ansible(3)
- awk(4)
- shell(3)
- about(1)
- git(9)
- bat(4)
- svn(0)
- docker(1)
- Tornado(1)
- go(2)
- 架构(18)
- Vue(1)
- game(2)
- Html(6)
- Java(8)
- Mysql(37)
- Ajax(2)
- Jsp(1)
- Struts(8)
- Linux(72)
- JavaScript(39)
- Staruml(0)
- Mouth(1)
- Php(102)
- Windows(8)
- Message(48)
- Lua(10)
- Compute(1)
- Redis(7)
- Nginx(12)
- Jquery(1)
- Apache(1)
- cocos2d-x(8)