MySQL 学习之索引篇和查询
1、如果查询中的列不是独立的,则mysql就不会使用索引。“独立的列”是指索引列不能是表达式的一部分,也不能是函数的参数
2、对于BLOB、TEXT或者很长的VARCHAR类型的列,必须使用前缀索引,因为mysql不允许索引这些列的完整长度
3、前缀索引是一种能使索引更小更快的有效办法,但mysql无法使用前缀索引做OREDR BY和GROUP BY,也无法使用其做覆盖扫描
4、选择索引的列顺序的法则:将选择性最高的列放到索引的最前面
5、对于mysql而言,最简单的衡量查询开销的三个指标如下:
- 响应时间
- 扫描的行数
- 返回的行数
6、mysql的执行过程:
- 客户端发送一条查询给服务器
- 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果,否则进入下一个阶段
- 服务器端进行sql解析、预处理、再由优化器生成对应的执行计划
- mysql根据优化器生成的执行计划,调用存储引擎的API来执行查询
- 将结果返回给客户端
7、mysql的查询状态
- Sleep:线程正在等待客户端发送新的请求
- Query:线程正在执行查询或者正在将结果发送给客户端
- Locked:在mysql服务器层,该线程正在等待表锁
- Analyzing and statistics : 线程正收集存储引擎的统计信息,并生成查询的执行计划
- Copying to tmp table [on disk]:
- 线程正在查询结果,并且将其结果都复制到一个临时表单中,如果有on disk标记,那表示mysql正在将一个内存临时表放到磁盘上
- Sorting result: 线程正在对结果集进行排序
- sending data : 这表示多种情况:线程可能是子啊多个状态之间传递数据,或者在生成结果集,或者在向客户端返回数据
8、
本作品采用《CC 协议》,转载必须注明作者和本文链接