@Override
	RecordIterator getExternalSymbolsByMemoryAddress(Address extProgAddr) throws IOException {
		if (extProgAddr == null) {
			return EmptyRecordIterator.INSTANCE;
		}
		String matchAddrStr = extProgAddr.toString();
		return new ConstrainedForwardRecordIterator(symbolTable.iterator(), rec -> {
			String str = getExternalStringData(rec);
			if (str != null) {
				int indexOf = str.indexOf(","); // [address][,importName]
				String addressString = indexOf >= 0 ? str.substring(0, indexOf) : str;
				if (matchAddrStr.equals(addressString)) {
					return convertV3Record(rec);
				}
			}
			return null;
		});
	}
SymbolDatabaseAdapter for version 3

This version provides for fast symbol lookup by namespace and name and introduced the use of 
sparse table columns for storing optional symbol data (hash, primary, datatype-ID, variable-offset).
It was created in June 2021 with ProgramDB version 24. 
It was first in affect within Ghidra starting at version 10.1
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/symbol/SymbolDatabaseAdapterV3.java