#转载请联系

  • 索引是什么?

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的位置信息。

更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。

  • 为什么需要索引

一般的应用系统对比数据库的读写比例在10:1左右(即有10次查询操作时有1次写的操作),而且插入操作和更新操作很少出现性能问题,遇到最多、最容易出问题还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。当数据库中数据量很大时,查找数据会变得很慢,我们就可以使用索引来提高数据库的查询效率。

  • 索引原理

数据库应该选择怎么样的方式来应对所有的问题呢?我们回想字典的例子,能不能把数据分成段,然后分段查询呢?最简单的如果1000条数据,1到100分成第一段,101到200分成第二段,201到300分成第三段……这样查第250条数据,只要找第三段就可以了,一下子去除了90%的无效数据。

mysql默认的存储引擎是InnoDB,InnoDB引擎的索引默认用B+Tree算法。

有关于B+Tree算法可以自行搜索下。

  • 查看表中已有索引
  1. show index from 表名;
  1. mysql> show index from student;
  2. +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
  3. | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
  4. +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
  5. | student | 0 | PRIMARY | 1 | id | A | 6 | NULL | NULL | | BTREE | | |
  6. | student | 0 | id | 1 | id | A | 6 | NULL | NULL | | BTREE | | |
  7. +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

我并没有给专门给student表添加过索引,但是由于student表的主键是id,主键默认添加索引,所以id字段也是索引。

  • 创建索引
  1. create index 索引名称 on 表名(字段名称(长度))
  2. # 如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致
  3. # 字段类型如果不是字符串,可以不填写长度部分
  • 删除索引
  1. drop index 索引名称 on 表名;
  • 验证索引是否能提升查找性能

1.创建一个表

  1. mysql> create table t_news(name varchar(10));

2.用python写个程序往表里插入10万条数据

  1. import pymysql
  2.  
  3. def main():
  4. conn = pymysql.connect(host='localhost',port=3306,
  5. user='root',password='xxx',
  6. database='text',charset='utf8')
  7. cur = conn.cursor()
  8. sql = 'insert into t_news value (%s)'
  9. for i in range(1,100001):
  10. cur.execute(sql,['新闻%d' % i])
  11. conn.commit()
  12. cur.close()
  13. conn.close()
  14.  
  15. if __name__ == '__main__':
  16. main()

结果(部分):

  1. | 新闻99994 |
  2. | 新闻99995 |
  3. | 新闻99996 |
  4. | 新闻99997 |
  5. | 新闻99998 |
  6. | 新闻99999 |
  7. | 新闻100000 |
  8. +--------------+
  9. 100000 rows in set (0.04 sec)

3.测试有无索引情况下查询的时间

  1. mysql> set profiling=1; # 开启时间监测
  2.  
  3. mysql> select * from t_news where name='新闻480916';
  4.  
  5. mysql> create index name_index on t_news(name(10));
  6.  
  7. mysql> select * from t_news where name='新闻480916';
  8.  
  9. mysql> show profiles; # 查看时间监测结果
  10. +----------+------------+------------------------------------------------+
  11. | Query_ID | Duration | Query |
  12. +----------+------------+------------------------------------------------+
  13. | 1 | 0.04325925 | select * from t_news where name='新闻480916' |
  14. | 2 | 1.64268400 | create index name_index on t_news(name(10)) |
  15. | 3 | 0.00065225 | select * from t_news where name='新闻480916' |
  16. | 4 | 0.00004275 | show profiling |
  17. +----------+------------+------------------------------------------------+
  18. # 对比第1和第3。可知结果快了很多倍!查询性能得到了优化!!!
  • 说在后面

索引虽然可以明显提高某些字段的查询效率。但是不要滥用,建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件。对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独建立索引了,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。索引也会占用磁盘空间(财大气粗的可以忽略不计)

end~~~

MYSQL通过索引优化数据库的查询的更多相关文章

  1. mysql索引优化比普通查询速度快多少

    mysql索引优化比普通查询速度快多少 一.总结 一句话总结:普通查询全表查询,速度较慢,索引优化的话拿空间换时间,一针见血,所以速度要快很多. 索引优化快很多 空间换时间 1.软件层面优化数据库查询 ...

  2. mysql使用索引优化查询效率

    索引的概念 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度.在没 ...

  3. 在MySQL中如何使用覆盖索引优化limit分页查询

    背景 今年3月份时候,线上发生一次大事故.公司主要后端服务器发生宕机,所有接口超时.宕机半小时后,又自动恢复正常.但是过了2小时,又再次发生宕机. 通过接口日志,发现MySQL数据库无法响应服务器.在 ...

  4. mysql 通过使用联全索引优化Group by查询

    /*SELECT count(*) FROM (*/ EXPLAIN SELECT st.id,st.Stu_name,tmpgt.time,tmpgt.goutong FROM jingjie_st ...

  5. MySQL 的索引优化

    索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的.My ...

  6. MySQL的索引优化,查询优化

    MySQL逻辑架构 如果能在头脑中构建一幅MySQL各组件之间如何协同工作的架构图,有助于深入理解MySQL服务器.下图展示了MySQL的逻辑架构图. MySQL逻辑架构,来自:高性能MySQL My ...

  7. MySQL的索引优化分析(一)

    一.SQL分析 性能下降.SQL慢.执行时间长.等待时间长 查询语句写的差 索引失效关联查询太多join(设计缺陷) 单值索引:在user表中给name属性创建索引,create index idx_ ...

  8. 【mysql】索引优化记录

    基础知识 Innodb存储引擎 支持行锁 支持事务: Myisam存储引擎 只支持表锁: 不支持事务: 常见索引列表 独立的列 前缀索引(索引选择性) 多列索引(并不是多个单列索引,索引顺序很重要) ...

  9. MySQL 字符串索引优化方案

    字符串建立索引的优化 1. 建立前缀索引 假设建立一个支持邮箱登录的用户表,对于邮件字段来说,可以有以下几种建立索引的方式: 直接对整个字符串建立索引 alter table SUser add in ...

随机推荐

  1. AndroidStudio0.5.5发布

    Google%E5%9C%A8%E5%BC%80%E6%BA%90%E4%B8%8A%E7%9A%84%E8%B4%A1%E7%8C%AE http://music.baidu.com/songlis ...

  2. windows下git hub的GUI软件配置与使用

    转载自:http://www.cnblogs.com/haore147/p/3618930.html   1. 安装两个软件 1 2 1. git的命令行程序--git for windows:htt ...

  3. highcharts图表插件初探

    转载请注明出处:http://www.cnblogs.com/liubei/p/highchartsOption.html HighCharts简介 Highcharts 是一个用纯JavaScrip ...

  4. BFS搜索

    参考博客:[算法入门]广度/宽度优先搜索(BFS) 适用问题:一个解/最优解 重点:我们怎么运用队列?怎么记录路径? 假设我们要找寻一条从V0到V6的最短路径.(明显看出这条最短路径就是V0-> ...

  5. 软件工程项目组Z.XML会议记录 2013/10/22

    软件工程项目组Z.XML会议记录 [例会时间]2013年10月22日星期二21:00-22:30 [例会形式]小组讨论 [例会地点]三号公寓楼会客厅 [例会主持]李孟 [会议记录]周敏轩 会议整体流程 ...

  6. [转]掌握 Dojo 工具包,第 2 部分: XHR 框架与 Dojo

    作者:secooler 快乐的DBA Ajax 的兴起改变了传统的 B/S 结构应用程序中以页面为单位的交互模式,Ajax 引入的局部刷新机制带来了更好的用户体验,促使浏览器中的页面开始向应用程序发展 ...

  7. ASP.NET页面之间传值Cookie(3)

    这个也是大家常使用的方法,Cookie用于在用户浏览器上存储小块的信息,保存用户的相关信息,比如用户访问某网站时用户的ID,用户的偏好等, 用户下次访问就可以通过检索获得以前的信息.所以Cookie也 ...

  8. RDMA

    什么是RDMA? 来源 https://blog.csdn.net/u011459120/article/details/78469098 1. 概述 RDMA是Remote Direct Memor ...

  9. [Leetcode] Populating next right pointer in each node 填充每个节点的右指针

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  10. clique 解题报告

    clique 题目描述 数轴上有 \(n\) 个点,第 \(i\) 个点的坐标为 \(x_i\),权值为 \(w_i\).两个点 \(i\),\(j\) 之间存在一条边当且仅当 \(abs(x_i-x ...