parker

凡上帝目光所及,皆可交易

View the Project on GitHub Spring-packer/parker

20 May 2019

Mysql 索引

by

目录


mysql 索引相关知识

mysql 表类型有两种:

myISAM 类型

不支持事务,主要是要求性能,所以查询要比innoDB快。 保存了表中具体的行数count(*) 不能包含where条件。

innoDB 类型

支持事务,对外部键支持等高级数据库功能

-

mysql优化之 导致查询不走索引的原因总结

  1. 多关键字查询 ORDER BY 和 limit 连用 : 如果where 字段,order by字段都是索引,那么有limit索引会使用order by字段所在的索引。没有limit会使用where 条件的索引遇到此类状况可以考虑用子查询将order by 和 limit 分开。这种情况主要发生在你用了多个索引,那么你需要注意了。它可能不执行你希望的走索引。(我觉得mysql会自动计算索引)
  2. DATE_FORMAT()格式化时间, 格式化之后 >= <= 比较大小 会导致放弃索引
  3. 子查询中order by的索引会失效,同时可能导致子查询中的where条件索引都不能用。
  4. 字符集的使用 可能会导致不走索引,有时候同一个sql的查询条件不同,where id =1 与 where id = 80 类似这种的 查询时间相差甚远。
  5. like句
    • col like % keyword % 一般不走索引
    • col like keyword% 一般使用索引
    • col like %keyword 一般不使用索引
      一般可以是代替为使用函数比如locate 位置函数,返回子字符串的位置,0 为不存在。 select column from table where locate(‘keyword’, ‘field’) > 0 即可 ,使用索引。
  6. 在where查询语句中使用表达式
  7. 在where查询语句中对字段进行NULL值判断
  8. 在where查询中使用了or关键字, myisam表能用到索引, innodb不行;(用UNION替换OR,可以使用索引)
  9. 全表扫描快于索引扫描(数据量小时)
当查询的数据量是总表数据的1/10 以上时 有可能会放弃索引的使用
一种强制使用索引的方案 ,使用关键字force index

select * from table force index time where time >= 20190520

今日问题一 压缩类型 orc snappy lzo rcfile gzip parquet 其中支持MR直接读取的是orc snappy parquet, lzo 建立索引之后可以读取。

今日问题二 client写入HDFS数据的过程

今日问题三 MR的执行过程

今日问题四 hive优化的五种方式 mapjoin 、join的random key、 表的分区 分桶、 其他忘了。。。

今日问题五 jvm的内存泄漏与调试工具 不会 。。。

今日问题六 MYsql数据库有两个索引, 你怎么知道他使用的是哪个? 很开放的问题

tags: