一、什么是索引
索引是一种数据结构,能够帮助我们快速地检索数据库中的数据
二、索引有几种 区别是什么
常见的MySQL主要有两种结构:哈希索引和B+树索引
时间复杂度:哈希索引O(1)、B+树索引O(logN)
B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接,是有序的;哈希索引是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可,是无序的。
区别:哈希索引适合等值查询,但是无法进行范围查询;哈希索引没办法利用索引完成排序;哈希索引不支持多列联合索引的最左匹配规则;如果有大量重复键值的情况下,哈希索引的效率会很低,因为存在哈希碰撞问题。
三、索引失效
有or必全有索引
复合索引未用左列字段
like以%开头
需要类型转换
where中索引列有运算
where中索引列使用了函数
如果mysql觉得全表扫描更快时(数据少)
四、Mysql存储引擎有哪些 有什么区别 适用场景
Mysql常用引擎有InnoDB、MyISAM、MEMORY、MERGE,默认使用InnoDB。
区别以及适用场景:
MyISAM不支持事务和行级锁,而且在崩溃后无法安全恢复;由于没有行锁机制,所以在海量写入的时候,会导致所有查询处于Locked状态
五、事务四个特性 四个隔离级别
六、分布式事务
七、SQL优化
补充
1、开启查询缓存,优化查询
2、explain你的select查询,这可以帮你分析你的查询语句或是表结构的性能瓶颈。EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的
3、当只要一行数据时使用limit 1,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据
4、为搜索字段建索引
5、使用 ENUM 而不是 VARCHAR。如果你有一个字段,比如“性别”,“国家”,“民族”,“状态”或“部门”,你知道这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是VARCHAR
6、Prepared Statements:Prepared Statements很像存储过程,是一种运行在后台的SQL语句集合,我们可以从使用prepared statements获得很多好处,无论是性能问题还是安全问题
Prepared Statements 可以检查一些你绑定好的变量,这样可以保护你的程序不会受到”SQL注入式“攻击
7、垂直分表
8、选择正确的存储引擎
八、Mysql日志
九、行级锁的优点和缺点
优点
1、当在许多线程中访问不同的行时只存在少量锁定冲突
2、回滚时只有少量的更改
3、可以长时间锁定单一的行
缺点:
1、比页级或表级锁定占用更多的内存
2、当在表的大部分中使用时,比页级或表级锁定速度慢,因为你必须获取更多的锁
3、如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表,比其它锁定明显慢很多
4、用高级别锁定,通过支持不同的类型锁定,你也可以很容易地调节应用程序,因为其锁成本小于行级锁定
十、分库分表原理 读写分离原理