mysql重命名数据库,但是视图还是原来数据库
发布时间:2025-05-16 13:24:46 发布人:远客网络
一、mysql重命名数据库,但是视图还是原来数据库
1、被取消的命令MySQL之前提供了一个 rename database db_old to db_new的命令来直接对数据库改名,可能由于实现的功能不完备(比如,这条命令可能是一个超大的事务,或者是由于之前的表很多还是 MyISAM等),后来的版本直接取消了这条命令。更改数据库名大致上有以下几种方案:
2、一、mysqldump导入导出要说最简单的方法,就是直接用 mysqldump工具,在旧库导出再往新库导入(最原始、最慢、最容易想到)的方法:旧库 yttdb_old导出(包含的对象:表、视图、触发器、事件、存储过程、存储函数)
3、二、改整库的表名利用 MySQL更改表名的方法来批量把旧库的所有表依次遍历,改名为新库的表。这种方法比第一种要快很多倍,但是没有第一步操作起来那么顺滑,不能一步到位。比如,要把数据库 yttdb_old改名为 yttdb_new,如果数据库 yttdb_old里只有磁盘表,那很简单,直接改名即可。或者写个脚本来批量改,非常简单。但是一般旧库里不只有磁盘表,还包含其他各种对象。这时候可以先考虑把旧库的各种对象导出来,完了在逐一改完表名后导进去。
4、三、历史方案其实在 MySQL早期还有一种方法。假设 MySQL部署好了后,所有的 binlog都有备份,并且二进制日志格式还是 statement的话,那就可以简单搭建一台从机,让它慢慢追主机到新的库名,等确切要更改旧库的时候,再直接晋升从机为主机即可。这里只需要从机配置一个参数来把旧库指向为新库:replicate-rewrite-db=yttdb_old->yttdb_new不过这种局限性很大,不具备标准化,不推荐。
5、总结其实针对 MySQL本身改库名,大致就这么几种方法:
6、数据量巨大,那就非 MySQL本身能解决的了。
7、可通过部署第三方 ETL工具,通过解析 MySQL二进制日志或其他的方式来把旧库数据直接读取到新库达到改名的目的等等。
二、mysql 有几种索引
1、如大家所知道的,Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。
2、那么,这几种索引有什么功能和性能上的不同呢?
3、即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE,ALTER TABLE,CREATE INDEX使用,不过目前只有 CHAR、VARCHAR,TEXT列上可以创建全文索引。值得一提的是,在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE INDEX创建FULLTEXT索引,要比先为一张表建立FULLTEXT然后再将数据写入的速度快很多。
4、全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE“%word%"这类针对文本的模糊查询效率较低的问题。在没有全文索引之前,这样一个查询语句是要进行遍历数据表操作的,可见,在数据量较大时是极其的耗时的,如果没有异步IO处理,进程将被挟持,很浪费时间,当然这里不对异步IO作进一步讲解,想了解的童鞋,自行谷哥。
5、创建ALTER TABLE table ADD INDEX `FULLINDEX` USING FULLTEXT(`cname1`[,cname2…]);
6、使用SELECT* FROM table WHERE MATCH(cname1[,cname2…]) AGAINST('word' MODE);
7、其中, MODE为搜寻方式(IN BOOLEAN MODE,IN NATURAL LANGUAGE MODE,IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION/ WITH QUERY EXPANSION)。
8、关于这三种搜寻方式,愚安在这里也不多做交代,简单地说,就是,布尔模式,允许word里含一些特殊字符用于标记一些具体的要求,如+表示一定要有,-表示一定没有,*表示通用匹配符,是不是想起了正则,类似吧;自然语言模式,就是简单的单词匹配;含表达式的自然语言模式,就是先用自然语言模式处理,对返回的结果,再进行表达式匹配。
9、对搜索引擎稍微有点了解的同学,肯定知道分词这个概念,FULLTEXT索引也是按照分词原理建立索引的。西文中,大部分为字母文字,分词可以很方便的按照空格进行分割。但很明显,中文不能按照这种方式进行分词。那又怎么办呢?这个向大家介绍一个Mysql的中文分词插件Mysqlcft,有了它,就可以对中文进行分词,想了解的同学请移步Mysqlcft,当然还有其他的分词插件可以使用。
10、Hash这个词,可以说,自打我们开始码的那一天起,就开始不停地见到和使用到了。其实,hash就是一种(key=>value)形式的键值对,如数学中的函数映射,允许多个key对应相同的value,但不允许一个key对应多个value。正是由于这个特性,hash很适合做索引,为某一列或几列建立hash索引,就会利用这一列或几列的值通过一定的算法计算出一个hash值,对应一行或几行数据(这里在概念上和函数映射有区别,不要混淆)。在java语言中,每个类都有自己的hashcode()方法,没有显示定义的都继承自object类,该方法使得每一个对象都是唯一的,在进行对象间equal比较,和序列化传输中起到了很重要的作用。hash的生成方法有很多种,足可以保证hash码的唯一性,例如在MongoDB中,每一个document都有系统为其生成的唯一的objectID(包含时间戳,主机散列值,进程PID,和自增ID)也是一种hash的表现。额,我好像扯远了-_-!
11、由于hash索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。那为什么还需要其他的树形索引呢?
12、在这里愚安就不自己总结了。引用下园子里其他大神的文章:来自 14的路的MySQL的btree索引和hash索引的区别
13、(1)Hash索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。
14、由于 Hash索引比较的是进行 Hash运算之后的 Hash值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash算法处理之后的 Hash值的大小关系,并不能保证和Hash运算前完全一样。
15、(2)Hash索引无法被用来避免数据的排序操作。
16、由于 Hash索引中存放的是经过 Hash计算之后的 Hash值,而且Hash值的大小关系并不一定和 Hash运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算;
17、(3)Hash索引不能利用部分索引键查询。
18、对于组合索引,Hash索引在计算 Hash值的时候是组合索引键合并后再一起计算 Hash值,而不是单独计算 Hash值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash索引也无法被利用。
19、(4)Hash索引在任何时候都不能避免表扫描。
20、前面已经知道,Hash索引是将索引键通过 Hash运算之后,将 Hash运算结果的 Hash值和所对应的行指针信息存放于一个 Hash表中,由于不同索引键存在相同 Hash值,所以即使取满足某个 Hash键值的数据的记录条数,也无法从 Hash索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。
21、(5)Hash索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。
22、对于选择性比较低的索引键,如果创建 Hash索引,那么将会存在大量记录指针信息存于同一个 Hash值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。
23、愚安我稍作补充,讲一下HASH索引的过程,顺便解释下上面的第4,5条:
24、当我们为某一列或某几列建立hash索引时(目前就只有MEMORY引擎显式地支持这种索引),会在硬盘上生成类似如下的文件:
25、4bca452157d4 76#4556,77#45cc…
26、hash值即为通过特定算法由指定列数据计算出来,磁盘地址即为所在数据行存储在硬盘上的地址(也有可能是其他存储地址,其实MEMORY会将hash表导入内存)。
27、这样,当我们进行WHERE age= 18时,会将18通过相同的算法计算出一个hash值==>在hash表中找到对应的储存地址==>根据存储地址取得数据。
28、所以,每次查询时都要遍历hash表,直到找到对应的hash值,如(4),数据量大了之后,hash表也会变得庞大起来,性能下降,遍历耗时增加,如(5)。
29、BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中,相信学过数据结构的童鞋都对当初学习二叉树这种数据结构的经历记忆犹新,反正愚安我当时为了软考可是被这玩意儿好好地折腾了一番,不过那次考试好像没怎么考这个。如二叉树一样,每次查询都是从树的入口root开始,依次遍历node,获取leaf。
30、BTREE在MyISAM里的形式和Innodb稍有不同
31、在 Innodb里,有两种形态:一是primary key形态,其leaf node里存放的是数据,而且不仅存放了索引键的数据,还存放了其他字段的数据。二是secondary index,其leaf node和普通的BTREE差不多,只是还存放了指向主键的信息.
32、而在MyISAM里,主键和其他的并没有太大区别。不过和Innodb不太一样的地方是在MyISAM里,leaf node里存放的不是主键的信息,而是指向数据文件里的对应数据行的信息.
33、RTREE在mysql很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。
34、相对于BTREE,RTREE的优势在于范围查找.
35、(1)对于BTREE这种Mysql默认的索引类型,具有普遍的适用性
36、(2)由于FULLTEXT对中文支持不是很好,在没有插件的情况下,最好不要使用。其实,一些小的博客应用,只需要在数据采集时,为其建立关键字列表,通过关键字索引,也是一个不错的方法,至少愚安我是经常这么做的。
37、(3)对于一些搜索引擎级别的应用来说,FULLTEXT同样不是一个好的处理方法,Mysql的全文索引建立的文件还是比较大的,而且效率不是很高,即便是使用了中文分词插件,对中文分词支持也只是一般。真要碰到这种问题,Apache的Lucene或许是你的选择。
38、(4)正是因为hash表在处理较小数据量时具有无可比拟的素的优势,所以hash索引很适合做缓存(内存数据库)。如mysql数据库的内存版本Memsql,使用量很广泛的缓存工具Mencached,NoSql数据库redis等,都使用了hash索引这种形式。当然,不想学习这些东西的话Mysql的MEMORY引擎也是可以满足这种需求的。
39、(5)至于RTREE,愚安我至今还没有使用过,它具体怎么样,我就不知道了。有RTREE使用经历的同学,到时可以交流下!
三、mysql怎么遍历所有用户表的所有表项
1、在MySQL中,遍历所有用户表的所有表项可以使用如下SQL语句:
2、首先,列出所有数据库中的表名:
3、SELECT table_name FROM information_schema.tables WHERE table_schema='your_database_name';
4、SELECT column_name FROM information_schema.columns WHERE table_name='your_table_name';
5、注意,这里使用了information_schema数据库作为元数据存储,其中包含了有关数据库表的详细信息。
6、对于特定用户数据库,可以进一步限定查询范围。例如,如果要查看特定用户的表,可以使用如下的SQL语句:
7、SELECT table_name FROM information_schema.tables WHERE table_schema='your_database_name' AND table_schema='your_user';
8、同样,要获取特定表的所有列信息,可以指定表名:
9、SELECT column_name FROM information_schema.columns WHERE table_name='your_table_name';
10、这里使用information_schema的tables和columns视图,提供了关于表和列的详细信息,包括表名、列名等。
11、需要注意的是,这些查询语句需要有足够的权限才能执行。在生产环境中,访问这些信息需要遵循最小权限原则。
12、在实际应用中,这些查询可以帮助你更好地理解数据库结构,以及进行必要的维护和优化。
13、此外,如果你需要遍历所有用户的表项,可以通过循环遍历每个用户的数据库名称,然后执行上述查询语句。
14、举例来说,可以编写一个存储过程或脚本来自动化这个过程:
15、CREATE PROCEDURE get_all_table_columns()
16、DECLARE done INT DEFAULT FALSE;
17、DECLARE user_name VARCHAR(255);
18、DECLARE cur CURSOR FOR SELECT user FROM mysql.user;
19、DECLARE CONTINUE HANDLER FOR NOT FOUND SET done= TRUE;
20、SELECT table_name FROM information_schema.tables WHERE table_schema= user_name;
21、调用这个存储过程,可以获取所有用户的表名和列信息。
22、通过这些方法,你可以全面了解MySQL数据库中所有用户的表结构,从而进行更有效的管理和优化。