设为首页 收藏本站
查看: 1375|回复: 0

[经验分享] MySQL专题9之MySQL索引、MySQL临时表、MySQL复制表

[复制链接]

尚未签到

发表于 2018-10-4 12:03:40 | 显示全部楼层 |阅读模式
  1、MySQL索引
  -  MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
  -  打个比方,如果合理的设计并使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。
  -  索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。
  -  创建索引时,你需要确保该索引是应用在SQL查询语句的条件(一般作为WHERE子句的条件)。
  -  实际上,索引也是一张表,该表保存了主键和索引字段,并指向实体表的记录。
  -  上面都在说使用索引的好处,但是过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE,因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
  -  建立索引会占用磁盘空间的索引文件。
  a、普通索引
  -  创建索引:这是最基本的索引,它没有任何限制。它有一下几种创建方式。
CREATE INDEX indexName ON mytable(username(length));  -  如果是CHAR、VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定length。
  -  修改表结构(添加索引):
ALTER table tableName ADD INDEX indexName(columnName)  -  创建表的时候直接指定:
CREATE TABLE mytable(  

  
ID INT NOT NULL,
  

  
username VARCHAR(16) NOT NULL,
  

  
INDEX [indexName] (username(length))
  

  
);
  -  删除索引的语法:
DROP INDEX [indexName] ON mytable;  b、唯一索引
  -  他与前面的普通索引类似,不同的是:索引列的值必须是唯一的,但是允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式。
  -  创建索引:
CREATE UNIQUE INDEX indexName ON mytable(username(length))  -  修改表结构:
ALTER table mytable ADD UNIQUE [indexName] (username(length))  -  创建表的时候直接指定:
CREATE TABLE mytable(  
ID INT NOT NULL,
  
username VARCHAR(16) NOT NULL,
  
UNIQUE [indexName] (username(length))
  
);
  c、使用ALTER命令添加和删除索引
  -  有四种方式添加数据表的索引:
  -  ALTER TABLE tbl_name ADD PRIMARY KEY (column_list):该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
  -  ALTER TABLE tbl_name ADD UNIQUE index_name (column_list):这条语句创建索引的值必须是唯一的(NULL可能会出现多次)
  -  ALTER TABLE tbl_name ADD INDEX index_name (column_list):添加普通索引,索引值可能出现多次。
  -  ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定索引为FULLTEXT,用于全文索引。
  -  以下实例为在表中添加索引:
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);  -  你还可以在ALTER命令中使用DROP子句来删除索引,尝试以下实例删除索引:
mysql> ALTER TABLE testalter_tbl DROP INDEX c;  d、使用ALTER命令添加和删除主键
  -  主键只能作用于一个列中,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;  
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
  -  你也可以使用ALTER命令来删除主键:
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;  -  删除主键只需要指定PRIMARY KEY,但是在删除索引时,你必须要知道索引名。
  e、显示索引信息
  -  你可以使用SHOW INDEX命令来列出表中的相关的索引信息。可以通过添加\G来格式化输出信息。如:
mysql> SHOW INDEX FROM table_name; \G  2、MySQL临时表
  -  MySQL临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接中可见,当关闭连接时,MySQL会自动删除表并释放所有空间。
  -  临时表在MySQL3.23版本中添加,如果你的MySQL版本低于3.23版本就无法使用MySQL的临时表。不过现在一般很少见再使用这么低版本的MySQL数据库服务。
  -  MySQL临时表只在当前连接中可见,如果你使用PHP脚本来创建MySQL临时表,那么每当PHP脚本执行完成之后,该临时表就会自动销毁。
  -  如果你使用其他MySQL客户端程序连接MySQL数据库来创建临时表,那么只有在关闭客户端程序时才会销毁临时表,当然你也可以手动销毁。
  -  以下实例展示了如何是引用MySQL临时表的简单实例。以下的SQL代码可以适用于PHP脚本的mysql_query()函数:
mysql> CREATE TEMPORARY TABLE SalesSummary (  
    -> product_name VARCHAR(50) NOT NULL
  
    -> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
  
    -> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
  
    -> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
  
);
  
Query OK, 0 rows affected (0.00 sec)
  

  
mysql> INSERT INTO SalesSummary
  
    -> (product_name, total_sales, avg_unit_price, total_units_sold)
  
    -> VALUES
  
    -> ('cucumber', 100.25, 90, 2);
  

  
mysql> SELECT * FROM SalesSummary;
  
+--------------+-------------+----------------+------------------+
  
| product_name | total_sales | avg_unit_price | total_units_sold |
  
+--------------+-------------+----------------+------------------+
  
| cucumber     |      100.25 |          90.00 |                2 |
  
+--------------+-------------+----------------+------------------+
  
1 row in set (0.00 sec)
  -  当你使用SHOW TABLES命令显示数据表列表时,你将无法看到SalesSummary表。
  -  如果你退出当前MySQL会话,再使用SELECT命令来读取原先创建的临时表数据,那你会发现数据库中没有该表的存在,因为在你退出时,该临时表已经被销毁了。
  -  删除MySQL临时表:默认情况下,当你断开与数据库的连接后,临时表就会自动被销毁。当然你可以在当前MySQL会话中使用DROP TABLE命令来手动删除临时表。
  -  以下是手动删除临时表的实例:
mysql> CREATE TEMPORARY TABLE SalesSummary (  
    -> product_name VARCHAR(50) NOT NULL
  
    -> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
  
    -> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
  
    -> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
  
);
  
Query OK, 0 rows affected (0.00 sec)
  

  
mysql> INSERT INTO SalesSummary
  
    -> (product_name, total_sales, avg_unit_price, total_units_sold)
  
    -> VALUES
  
    -> ('cucumber', 100.25, 90, 2);
  

  
mysql> SELECT * FROM SalesSummary;
  
+--------------+-------------+----------------+------------------+
  
| product_name | total_sales | avg_unit_price | total_units_sold |
  
+--------------+-------------+----------------+------------------+
  
| cucumber     |      100.25 |          90.00 |                2 |
  
+--------------+-------------+----------------+------------------+
  
1 row in set (0.00 sec)
  
mysql> DROP TABLE SalesSummary;
  
mysql>  SELECT * FROM SalesSummary;
  
ERROR 1146: Table 'RUNOOB.SalesSummary' doesn't exist
  3、MySQL复制表
  -  如果我们需要完全的复制MySQL的数据表,包括表的结构、索引、默认值等,如果仅仅使用CREATE TABLE...SELECT命令,是无法实现的。
  -  本节将向大家介绍如何使用完整的复制MySQL数据表,步骤如下:
  a、使用SHOW CREATE TABLE命令获取创建数据表(CREATE TABLE)语句,该语句包含了元数据表的结构,索引等。
  b、复制一下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令将完成的复制数据表结构。
  c、如果你想复制表的内容,你就可以使用INSERT INTO ...SELECT语句来实现。
  -  实例:尝试复制表runnoob_tbl。
  -  步骤一:获取数据表的完整结构:
mysql> SHOW CREATE TABLE runoob_tbl \G;  
*************************** 1. row ***************************
  
       Table: runoob_tbl
  
Create Table: CREATE TABLE `runoob_tbl` (
  
  `runoob_id` int(11) NOT NULL auto_increment,
  
  `runoob_title` varchar(100) NOT NULL default '',
  
  `runoob_author` varchar(40) NOT NULL default '',
  
  `submission_date` date default NULL,
  
  PRIMARY KEY  (`runoob_id`),
  
  UNIQUE KEY `AUTHOR_INDEX` (`runoob_author`)
  
) ENGINE=InnoDB
  
1 row in set (0.00 sec)
  

  
ERROR:
  
No query specified
  -  修改SQL语句的数据表名,并执行SQL语句:
mysql> CREATE TABLE `clone_tbl` (  
  -> `runoob_id` int(11) NOT NULL auto_increment,
  
  -> `runoob_title` varchar(100) NOT NULL default '',
  
  -> `runoob_author` varchar(40) NOT NULL default '',
  
  -> `submission_date` date default NULL,
  
  -> PRIMARY KEY  (`runoob_id`),
  
  -> UNIQUE KEY `AUTHOR_INDEX` (`runoob_author`)
  
-> ) ENGINE=InnoDB;
  
Query OK, 0 rows affected (1.80 sec)
  -  步骤三:执行完第二步骤后,你将在数据库中创建新的克隆表clone_tbl。如果你想拷贝数据表的数据你可以使用INSERT INTO ...SELECT语句来实现:
mysql> INSERT INTO clone_tbl (runoob_id,  
    ->                        runoob_title,
  
    ->                        runoob_author,
  
    ->                        submission_date)
  
    -> SELECT runoob_id,runoob_title,
  
    ->        runoob_author,submission_date
  
    -> FROM runoob_tbl;
  
Query OK, 3 rows affected (0.07 sec)
  
Records: 3  Duplicates: 0  Warnings: 0
  -  执行以上步骤后,你将完整的复制表,包括表的结构以及表的数据。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-611832-1-1.html 上篇帖子: cent os 7 安装mysql-7015553 下篇帖子: MySQL专题7之MySQL连接、 MySQL MULL值得处理以及MySQL 正则表达式的使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表