mysql优化之建立索引
遇到的问题?(什么情况下说明你要建立索引了?)
1.明明数据量不大,百万级以下,数据库查询速度过慢。
2.用了数据库线程池但还是会爆掉。
相关报错举例:
A. Could not get JDBC Connection.无法获得JDBC连接
B. Cannot get a connection, pool error Timeout waiting for idle object.池错误超时等待空闲对象
索引是什么?(这个可以不看,总之索引是给表建立了一个字典目录,根据目录查询数据库会很快)
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。
当表中有大量记录时,若要对表进行查询:
第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;
第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。
如何添加索引?
1.可以使用工具添加,比如:sqlyog中选择表右键“管理索引”即可。
2.执行sql建立索引。
举例:ALTER TABLE 库名
.表名
ADD INDEX idx_couponsCode
(coupons_Code
);
其中idx_couponsCode为索引名,可以自定义,coupons_Code为表中字段名。
如何使用索引?
注意:索引是数据库查询时自动辨别使用的。
(对于字符串类型字段,若在WHERE中使用LIKE进行过滤时,是不会用到索引的。)
怎样验证数据库查询是否使用了索引?(圈重点)
EXPLAIN关键字
使用方式,EXPLAIN+SQL语句即可.
我们只需要注意一个最重要的type 的信息很明显的提现是否用到索引:
type结果值从好到坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。
possible_keys:sql所用到的索引
key:显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL
rows: 显示MySQL认为它执行查询时必须检查的行数。