ALTER TABLE 表名 ADD INDEX 索引名(列名);
CREATE INDEX 索引名 ON 表名(列名);
ALTER TABLE 表名 ADD UNIQUE INDEX 索引名(列名);
CREATE UNIQUE INDEX 索引名 ON 表名(列名);
ALTER TABLE 表名 ADD INDEX 索引名(列名,列名2);
CREATE INDEX 索引名 ON 表名(列名1,列名2);
ALTER TABLE 表名 ADD FULLTEXT INDEX 索引名(列名);
CREATE FULLTEXT INDEX 索引号 ON 表名(列名);
ALTER TABLE 表名 ADD SPATIAL INDEX 索引名(列名);
CREATE SPATIAL INDEX 索引号 ON 表名(列名);
对Explain 结果中参数的理解?
参数: Type 连接类型
连接类型(the join type), 描述了找到所需数据使用的扫描方式, 最为常见的扫描方式从快到慢依次为
system
系统表, 少量数据, 往往不需要进行磁盘IO, 扫描类型为system 说明数据已经加载到内存, 不需要磁盘IO, 这类扫描是速度最快的
const
常量连接, 主键或者唯一键上的等值查询, const扫描的条件为
- 命中主键(primary key)或者唯一(unique)索引
- 被连接的部分是一个常量(const)值
eq_ref
主键索引(primary key)或者非空唯一索引(unique not null)等值扫描, eq_ref扫描的条件为: 对于前表的每一行(row), 后表只有一行被扫描.
ref
非主键非唯一索引等值扫描. 对于前表的每一行(row), 后表可能有多于一行的数据被扫描.
range
range, 范围扫描, 它是索引上的范围查询, 它会在索引上扫码特定范围内的值.
index
index, 索引树扫描, 需要扫描索引上的全部数据.
ALL
全表扫描
参数: Extra
Using where
SQL使用了where条件过滤数据.
Using index
SQL所需要返回的所有列数据均在一棵索引树上, 而无需访问实际的行记录.
Using index condition
说明确实命中了索引, 但不是所有的列数据都在索引树上, 还需要访问实际的行记录.
Using filesort
说明得到所需结果集, 需要对所有记录进行文件排序. 典型的, 在一个没有建立索引的列上进行了order by, 就会触发filesort, 常见的优化方案是, 在order by的列上添加索引, 避免每次查询都全量排序.
Using temporary
说明使用了临时表(temporary table)来暂存中间结果. 这类SQL语句性能较低, 往往也需要进行优化. 例如 group by和order by同时存在, 且作用于不同的字段时, 就会建立临时表.
索引与锁有什么关系?
mysql innodb的锁是通过锁索引来实现的