MYSQL FAQ
博客专区 > TedCruz 的博客 > 博客详情
MYSQL FAQ
TedCruz 发表于7个月前
MYSQL FAQ
  • 发表于 7个月前
  • 阅读 8
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

导出远程sql

本地配置mysql环境变量或者进入mysql/bin目录

导入sql

进入sql所在文件夹,gui bash,-p和password不能有空格

索引

MysqlMYISAM使用的是非聚集索引 索引文件和数据文件分开

innodb使用的是聚集索引 索引和数据在同一个文件 默认以主键为索引

Mysql为什么使用B+ tree作为索引数据结构,而不用hash算法?

  1. hash算法虽然速度快,但是不适合处理范围条件的查询。
  2. hash算法存在指针碰撞问题(散列不均匀会降低查询效率), 在有大量重复键值情况下,哈希索引的效率也是极低的

  3. 哈希索引文件中存放的是哈希算法运算后的值,无法确定key的顺序,所以哈希索引也没办法利用索引完成排序;而B+ tree的叶子节点自动实现了排序

 在 Innodb 存储引擎中,存在两种不同形式的索引,一种是 Cluster 形式的主键索引( Primary Key ),另外一种则是和其他存储引擎(如 MyISAM 存储引擎)存放形式基本相同的普通 B-Tree 索引,这种索引在 Innodb 存储引擎中被称为 Secondary Index 。 在 Primary key中, Leaf Nodes 存放的是表的实际数据,不仅仅包括主键字段的数据,还包括其他字段的数据据以主键值有序的排列。而 Secondary Index 则和其他普通的 B-Tree 索引没有太大的差异,Leaf Nodes 除了存放索引键 的相关信息外,还存放了 Innodb 的主键值。 

      所以,在 Innodb 中如果通过主键来访问数据效率是非常高的,而如果是通过 Secondary Index 来访问数据的话, Innodb 首先通过 Secondary Index 的相关信息,通过相应的索引键检索到 Leaf Node之后,需要再通过 Leaf Node 中存放的主键值再通过主键索引来获取相应的数据行。MyISAM 存储引擎的主键索引和非主键索引差别很小,只不过是主键索引的索引键是一个唯一且非空 的键而已。而且 MyISAM 存储引擎的索引和 Innodb 的 Secondary Index 的存储结构也基本相同,主要的区别只是 MyISAM 存储引擎在 Leaf Nodes 上面出了存放索引键信息之外,再存放能直接定位到 MyISAM 数据文件中相应的数据行的信息(如 Row Number ),但并不会存放主键的键值信息

索引建立原则

  1. 最左前缀匹配原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配
  2. 尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例
  3. 索引列不能参与计算
  4. 尽量的扩展索引(组合索引),不要新建索引

慢查询优化基本步骤

0.先运行看看是否真的很慢,注意设置SQL_NO_CACHE
1.where条件单表查,锁定最小返回记录表。这句话的意思是把查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高
2.explain查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询)
3.order by limit 形式的sql语句让排序的表优先查
4.了解业务方使用场景
5.加索引时参照建索引的几大原则
6.观察结果,不符合预期继续从0分析

优化SQL语句

set global log_slow_queries = on;  

set global long_query_time =1;

set global slow_query_log_file= 'e:/slowquery.log';

show global variables like 'long_query_time';

show variables like '%slow%';

 

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 12
博文 38
码字总数 29780
×
TedCruz
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: