`

MySQL常识

阅读更多

MySQL可以说是程序员应用最多的数据库,下面笔者为大家分享MySQL数据库开发当中的一些常识,存储引擎的选择,索引的设计及使用和大批量插入时SQL语句的优化。希望能对大家有帮助。

 

 

 

原文地址:http://www.cnblogs.com/zzbbs/archive/2011/02/22/1961743.html

  存储引擎的选择

  声明:本文所针对的数据库版本都是MYSQL 5这里我主要针对两种存储引擎进行简单比较分别是MyISAM和InnoDB,首先比较下区别:

  1. MyISAM不支持事务,不支持外键,优点是访问速度高,批量插入速度快。假设大量的操作是select、insert,建议采用该存储引擎。但是在我的实际应用中,出现过批量插入过于频繁的时候,当数据量到达一定级别,出现表损坏的情况。

  2. InnoDB支持事务处理,但是相对于前者,处理效率低一些,并且其索引及数据也更占用磁盘空间。在存储一些关键数据,并需要对其进行事务操作的时候,我们可以选择innodb,当然,我认为他不应该是访问量太大的。

  索引的设计及使用

  没有索引的表是恐怖的,除非里头没多少数据,但是怎么设计索引是合理的?恐怕不是所有人都明白,这里简要分析下索引的设计及使用。

  1. 索引通常是设置where字句中的列,如果你设置select后的列,这是没有任何意义的。当然你需要对某列进行排序,order by后的列也是可以建成索引的。

  2. 使用唯一索引,主键就是最好的例子,假设你建的索引列,大量都是重复的,例如:性别,那么这样的索引并不会加快搜索速度。至于为什么,请大家自行了解索引的工作原理。

  3. 只要有可能,就要尽量限定索引的长度,例如索引列为 char(100),在其前10个字符大部分都是唯一的,请设置索引的长度为10,使用短索引可以加快查询速度,并节省硬盘空间。

  4. 索引的左前缀特性,联合索引实质上也是建立了多个的索引,那么是建立联合索引好还是分别建多个索引好呢?显然前者更好,利用左前缀特性,只要联合索引的最左的列被用到,那么索引都会被使用。

  5. 当然,最后要说的是,不要过度使用索引,索引越多,插入的速度越慢,尤其到数据量庞大时,同时,大量的索引将耗费很多硬盘空间,造成不必要的浪费。

  下面举几个列子来说明索引的使用:

  1.联合索引的左前缀

  先看索引结构:

以下是代码片段:
 mysql
> show index from user
  
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
  | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | 
  
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
  | user  |    0 | PRIMARY  |1 | user_id     | A   |     2 |     NULL | NULL   || BTREE|   | 
  
| user  |    1 | user     |1 | username    | A   |  NULL |     NULL | NULL   || BTREE|   | 
  
| user  |    1 | user     |2 | order | A   |  NULL |     NULL | NULL   || BTREE|   | 
  
| user  |    1 | user     |3 | email | A   |  NULL |     NULL | NULL   | YES  | BTREE|   | 
  
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
  4 rows in set (0.00 sec)

  

user是联合索引的名称,包含3个列,分别是username,order,email。接下来执行以下sql,使用explain命令来分析下运行结果。

 

以下是代码片段:
 mysql
> explain select * from user where username='leehui'
  
+----+-------------+-------+------+---------------+------+---------+-------+------+--------+ 
  | id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra | 
  
+----+-------------+-------+------+---------------+------+---------+-------+------+--------+ 
  |  1 | SIMPLE| user  | ref  | user    | user | 152     | const |    1 | Using where | 
  
+----+-------------+-------+------+---------------+------+---------+-------+------+--------+ 
  1 row in set (0.00 sec) 
  mysql
> explain select * from user where pws='123'
  
+----+-------------+-------+------+---------------+------+---------+------+------+---------+ 
  | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra | 
  
+----+-------------+-------+------+---------------+------+---------+------+------+---------+ 
  |  1 | SIMPLE| user  | ALL  | NULL    | NULL | NULL    | NULL |    2 | Using where | 
  
+----+-------------+-------+------+---------------+------+---------+------+------+---------+ 
  1 row in set (0.00 sec)

  在两句sql中,我们可以发现,第一个sql虽然没用上,全部的索引列,但由于使用到了最左端的列,所以,联合索引还是启用了,第二句没有使用到最左的列,所以索引没有使用。

 

2.关于like关键字

  对于使用like的查询,需要注意的是只有列的%不在第一个字符索引才可能被使用。以下分别展示了使用like的查询,第一个是索引被使用的,第二个是索引未被使用的。

以下是代码片段:
 mysql
> explain select * from user where username like'lee%'
  
+----+-------------+-------+-------+---------------+------+---------+------+------+---------+ 
  | id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra | 
  
+----+-------------+-------+-------+---------------+------+---------+------+------+---------+ 
  |  1 | SIMPLE| user  | range | user    | user | 152     | NULL |    1 | Using where | 
  
+----+-------------+-------+-------+---------------+------+---------+------+------+---------+ 
  1 row in set (0.00 sec) 
  mysql
> explain select * from user where username like'%lee'
  
+----+-------------+-------+------+---------------+------+---------+------+------+----------+ 
  | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra | 
  
+----+-------------+-------+------+---------------+------+---------+------+------+----------+ 
  |  1 | SIMPLE| user  | ALL  | NULL    | NULL | NULL    | NULL |    2 | Using where | 
  
+----+-------------+-------+------+---------------+------+---------+------+------+----------+ 
  1 row in set (0.00 sec)

   3. 查看索引使用情况

  使用以下命令:

 mysql> show status like 'Handler_read_key'
  
+------------------+-------+ 
  | Variable_name    | Value | 
  
+------------------+-------+ 
  | Handler_read_key | 0     | 
  
+------------------+-------+ 
  1 row in set (0.00 sec)

  如果索引正在工作,那么Handler_read_key 会很高,如果查询中出现Handler_read_rnd_next的值很高,则表明查询低效,索引的应用并不合理。

 

大批量插入时的SQL语句优化

  在大量插入时,尤其是并发插入时,mysql往往要承受更高的负载,使用mysql administortar的健康检查就可以发现,其avg的值相当高,在这种情况下,首先要做的是sql语句的优化,比较下面两个句子,后者的速度比前者要快得多。因为减少大量的连接。

  复制内容到剪贴板代码:

以下是代码片段:
 
insert into test values(aa,bb) 
  
insert into test values(cc,dd) 
  
insert into test values (aa),(bb),(cc),(dd)

  在我的一个实际应用中,由于需要经常有数百个并发的插入,我还采用了insert delayed into来取代insert into,前者与后者的区别是在执行插入语句时,数据保存在内存队列中,待数据库空闲时执行,但是会立即返回一个插入成功的信息。使用insert delayed into时需要注意:此时不能使用mysql_insert_id(),因为此时并没有真正插入。对特别重要的数据不宜采用该语句,避免数据以外丢失。

  其他杂谈

  1.mysql myisam 表超过4G无法访问的解决

  myisam引擎默认是支持4GB,innodb理论上可以到6TB,假设单张表容量超过4GB,可能导致表都无法访问了。可以通过以下命令增加表最大数据量:

以下是代码片段:
 mysql
> alter table user MAX_ROWS=1000000000 AVG_ROW_LENGTH=15000
  Query OK, 
2 rows affected (0.09 sec) 
  Records: 
2  Duplicates: 0  Warnings: 0
分享到:
评论

相关推荐

    mysql常识总结.pdf

    mysql常识总结.pdf

    MySQL应用常识手册

    MySQL应用常识.rar  严格地说,数据库是“按照数据结构来组织、存储和管理数据的仓库”。在经济管理的日常工作中,常常需要把某些相关的数据放进这样的“仓库”,并根据管理的需要进行相应的处理。例如,企业或事业...

    mysql基本常识及php连接

    mysql基本常识 对小白有助提升

    基于php食谱网设计与实现.docx

    ...本文的主要内容包括系统概述、管理系统概述、PHP 简介及工作环境、数据库及 MySQL 等方面的知识点。...这里,我们将对 MySQL 的常识和基本操作进行介绍,包括创建数据库、创建表、插入数据、查询数据等。

    MySQL必知必会常识技巧实战宝典

    ### MySQL必知必会常识技巧实战宝典 #### 1. 数字类型:避免自增踩坑 在MySQL中,数字类型的选择对于确保数据的准确性和优化存储空间至关重要。特别是对于自增列(如`AUTO_INCREMENT`),如果不合理设置初始值、...

    mysql应用常识

    了解MySQL的应用常识对于任何IT专业人员,特别是数据库管理员和开发人员来说都至关重要。以下是一些关于MySQL应用的关键知识点: 1. **安装与配置**:MySQL的安装过程包括下载安装包,配置服务器设置,如端口、数据...

    Mysql应用常识

    MySQL是世界上最受欢迎的关系型数据库管理系统之一,尤其在Web应用程序中被广泛应用。本教程将深入探讨MySQL的...MySQL的应用常识是每个开发者和数据库管理员必备的知识,希望本教程能为你的学习之路提供坚实的基础。

    jquery下拉菜单

    而"Mysql常识与基本操作.docx"文件则可能涵盖数据库方面的内容,与前端开发不直接相关,但对于构建动态网站来说,了解数据库操作仍然是必要的。 总结来说,jQuery下拉菜单是网页交互设计中的一个重要组成部分,它...

    驾考题库mysql版本,即到即用

    在中国,驾驶理论考试分为科目一(交通法规及安全文明驾驶知识)和科目四(安全文明驾驶常识)。因此,B2_1.sql可能包含了B2驾照类别的科目一试题数据,而A1_4.sql则可能包含A1驾照类别的科目四试题数据。 SQL文件...

    mysql导出csv&&iconv;文件转码.pdf

    在当今数据处理领域,将数据从数据库导出到CSV文件并进行转码是一种常见的需求,...需要注意的是,由于OCR扫描技术的局限性,文档中可能存在一些识别错误或遗漏,用户需要根据上下文和常识,对这些错误进行纠正和理解。

    MySQL 5.5从零开始学--扫描版、带书签目录

    但是,根据常识,这部分内容很可能只是扫描文档时产生的无关内容。 知识点总结: MySQL是一种流行的开源关系型数据库管理系统,它支持各种操作系统的使用,并广泛应用于各种应用程序中。MySQL 5.5版本是该软件的一...

    html5+JavaScript+css+mysql实现的基于thinkphp的医学常识的介绍平台设计与实现

    在本项目"html5+JavaScript+css+mysql实现的基于thinkphp的医学常识的介绍平台设计与实现"中,开发者采用了一系列技术构建了一个用于分享和学习医学常识的在线平台。这个平台利用现代Web技术,旨在提供一个交互性强...

    数据库Mysql基础知识总结

    **数据库MySQL基础知识...以上就是对“数据库MySQL基础知识总结”的详细解读,涵盖了MySQL的基础概念、数据类型、常用操作以及一些数据库设计和管理的基本常识。通过这些知识,可以为初学者构建一个坚实的学习基础。

    手册包(html+css+js+mysql+linux+php等等)

    网页设计与开发是一个涵盖多个领域的综合过程,这个压缩包提供了必要的参考资料,涵盖了HTML5、CSS2.0/3.0、JavaScript5.5、MySQL5.1以及PHP的相关手册,同时还包括了网页设计的配色常识。下面将对这些关键知识点...

    php+mysql开发中的经验与常识小结

    本文总结了php+mysql开发中的经验与常识。分享给大家供大家参考,具体如下: 一、基础规范 (1)尽量使用 InnoDB 存储引擎 支持事务、行级锁、并发性能更好,CPU 及内存缓存页优化得当,资源利用率更高 (2)必须...

    毕业论文jsp1461化妆品商城销售mysql.doc

    该系统基于 JSP 语言开发,使用 MySql 作为数据库管理系统,开发环境是 MyEclipse,服务器采用 tomcat。 该系统的主要功能包括: 1. 商品类别管理:提供了不同的商品类别,方便用户快速浏览和查找相关商品信息。 2...

    毕业设计javajsp化妆品商城销售mysql-qrp源码含文档工具包

    通过“安黎之“化妆品专卖网这个平台,可以使用户足不出户就可以了解丰富的商品信息,极大的方便了用户,系统的主要功能包括:商品类别管理、商品信息管理、订单管理、会员管理、护肤常识管理等。分为管理员用户、...

    SpringBoot+Mysql准妈妈孕期交流平台.(源码+lw+ppt)

    本准妈妈孕期交流平台采用的数据库是Mysql,使用springboot框架开发 实现管理员:首页、个人中心、用户管理、早教知识管理、待产经验分享管理、怀孕常识管理、月子食谱管理、好物推荐管理、好物类型管理、圈子交流、...

Global site tag (gtag.js) - Google Analytics