#mysql索引概念
/*
索引通俗来讲就像是一本书的目录
对数据库来说,索引的作用即是给数据加目录
索引实际上是一种数据结构
索引的意义和作用就是加快查询速度
索引本质上是数据结构
索引的好处:加快了查询速度(SELECT)
索引的坏处:
降低了增删改的速度(UPDATE/DELETE/INSERT)
增大了表的文件大小(索引文件甚至可能比数据文件还大)
btree(二叉树)索引 查找log2N次
哈希索引又叫散列索引
hash(哈希)索引 理论上可以最少1次就能查到数据
哈希算法又叫散列算法
(算出来的值,不连续)
碰撞性:2个值算出来同一个结果(比如MD5加密就有提到碰撞性)
碰撞性高,说明散列算法性能低,说明该散列算法写的不太好
还要注意最大区间
*/
/*
比如:换服务器导入数据
.sql文件
新闻表 500万行数据
新闻表共15列,其中10列加了索引
如果直接导入数据会非常耗时
建议如下做法:
1.先去掉索引
2.再导入数据
3.最后再统一加索引
*/
/*
索引的使用原则
1.不过度索引
2.索引条件列(WHERE后面最频繁的条件比较适宜索引)
3.索引散列值,越散越好,过于集中的值不要索引
比如像以下列的值就过于集中了,给这些列加索引,其实意义不大
比如:给性别列"男","女"加索引,意义不大
比如:给省市列"黑龙江","吉林","河北","湖北","江西","湖南","广东"加索引,意义不大
*/
/*
索引的优化和数据库优化是一门挺大的学问,并非一朝一夕能掌握
*/
#查看索引的使用情况
SHOW STATUS LIKE 'Handler_read%';
#Handler_read_key的值高,索引查询多,查询效率越高
SHOW STATUS LIKE 'Handler_read_key%';
#Handler_read_rnd_next的值高,随机查询多,查询效率越低
SHOW STATUS LIKE 'Handler_read_rnd_next%';
#
EXPLAIN SELECT * FROM account2 WHERE MATCH(introduce) AGAINST ('hometown');
#
SELECT SYSDATE(), SYSDATE() - 1, SYSDATE() - 5;